java在服务器上并行运行服务

我有一个处理用户请求的服务。

此服务调用另一个外部后端系统(Web服务)。 但我需要并行执行这些后端Web服务。 你会怎么做? 什么是最好的方法?

提前致谢

- - -编辑

后端系统可以并行运行请求,我们使用容器(如tomcat for development)和websphere最终用于生产。 所以我已经在一个线程(servlet)中,需要产生两个任务,并且可能尽可能并行地并行运行它们。


我可以想象使用石英或线程与执行器或让它在Servlet引擎上。 采取这种方案的正确途径是什么?


您可以使用Threads并行运行请求。

根据你想要做什么,建立一些现有的技术如Servlets可能对你有帮助


答案是在不同的线程中运行任务。

对于这样的事情,我认为你应该使用具有有限池大小的ThreadPoolExecutor ,而不是自己创建线程。

代码看起来像这样。 (请注意,这只是一个草图,查看javadocs的详细信息,数字的含义等信息)

// Create the executor ... this needs to be shared by the servlet threads.
Executor exec = new ThreadPoolExecutor(1, 10, 120, TimeUnit.SECONDS,
        new ArrayBlockingQueue(100), ThreadPoolExecutor.CallerRunsPolicy);

// Prepare first task
final ArgType someArg = ...
FutureTask<ResultType> task = new FutureTask<ResultType>(
        new Callable<ResultType>() {
            public ResultType call() {
                // Call remote service using information in 'someArg'
                return someResult;
            }
});
exec.execute(task);

// Repeat above for second task
...
exec.execute(task2);

// Wait for results
ResultType res = task.get(30, TimeUnit.SECONDS);
ResultType res2 = task2.get(30, TimeUnit.SECONDS);

上述内容不会试图处理异常,您需要在超时时间内做更复杂的事情; 例如跟踪整个请求时间并取消随时间推移的任务。


这不是Quartz设计要解决的问题。 Quartz是一个作业调度系统。 你只需要尽快执行一些任务......可以让设施取消它们。


Heiko是正确的,你可以使用线程。 线程是复杂的野兽,需要小心处理。 最好的解决方案是使用标准库,比如java.util.concurrent。 这将是管理并行操作的更健壮的方式。 这种方法带来了性能优势,例如线程池。 如果你可以使用这样的解决方案,这将是推荐的方式。

如果你想自己做,这是一个并行执行多个线程的非常简单的方法,但可能不是很强大。 你需要更好地处理超时和线程的破坏等。

public class Threads {
    public class Task implements Runnable {
        private Object result;
        private String id;

        public Task(String id) {
            this.id = id;
        }

        public Object getResult() {
            return result;
        }

        public void run() {
            System.out.println("run id=" + id);
            try {
                // call web service
                Thread.sleep(10000);
                result = id + " more";
            } catch (InterruptedException e) {
                // TODO do something with the error
                throw new RuntimeException("caught InterruptedException", e);
            }
        }
    }

    public void runInParallel(Runnable runnable1, Runnable runnable2) {
        try {
            Thread t1 = new Thread(runnable1);
            Thread t2 = new Thread(runnable2);

            t1.start();
            t2.start();

            t1.join(30000);
            t2.join(30000);
        } catch (InterruptedException e) {
            // TODO do something nice with exception
            throw new RuntimeException("caught InterruptedException", e);
        }
    }

    public void foo() {
        Task task1 = new Task("1");
        Task task2 = new Task("2");

        runInParallel(task1, task2);

        System.out.println("task1 = " + task1.getResult());
        System.out.println("task2 = " + task2.getResult());
    }
}
链接地址: http://www.djcxy.com/p/35385.html

上一篇: java run services in parallel on the server

下一篇: Random Error in typescript while compiling angular 5 project