我有一个servlet,它调用Web服务。
servlet不需要等待servlet结束,因为它不需要来自其响应的任何信息。
我可以生成一个新的线程来调用Web服务吗?
是否可以通过new Thread(callWSMethod())。start()?
完成>如果不建议这样做,还有什么更好的方法?
由于不需要像UserTransaction
这样的JEE资源,所以我觉得这样做很好。但是,请务必阅读到最后。
在早期版本的JEE中,我记得不建议这样做,因为启动线程不会具有EJB,连接池,JTA事务等托管资源和上下文。但是,我不确定是否仍不建议在JEE7中使用。 JEE7中仍然有ManagedExecutorService可用于此目的。
但是,我已经做了很多次而没有直接对ExecutorService
造成任何问题,只要我不希望像前面提到的那样有任何托管资源。我一直使用ExecutorService
,而不是直接使用Thread
。唯一的“监视”是在处理结束时必须以某种方式关闭ExecutorService
。
但是许多人不同意这种方法。我们也要听听其他人的意见。
看起来servlet只对触发(触发并忘记)分布在其他地方的进程/线程感兴趣。在这种情况下,当您调用不与您的应用程序共享任何内容的隔离服务时,我不必担心事务或托管资源。
您可以简单地启动一个线程:
public class MyThread extends Thread {
public void run(){
// callWSMethod
}
}
一种优雅的方式是使用Java Lambda
Runnable callWSMethod =
() -> { // perform call};
Thread thread = new Thread(callWSMethod);
thread.start();
线程池
该servlet可能会收到多个请求,如果您期望数量很大,则希望限制应用程序创建的线程数。您可以使用ExecutorService
ExecutorService executorService = Executors.newFixedThreadPool(5);
executorService.execute(new Runnable() {
public void run() {
// perform call};
}
});
不要忘记关机
executorService.shutdown();