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