【发布时间】:2020-01-16 08:47:01
【问题描述】:
我有一个调用 Web 服务的 servlet。
servlet 不需要等待 servlet 结束,因为它不需要来自其响应的任何信息。
我可以生成一个新线程来调用网络服务吗?
会用 new Thread(callWSMethod()).start() 来完成吗?
如果不建议这样做,有什么更好的方法?
【问题讨论】:
标签: java web-services servlets java-threads
我有一个调用 Web 服务的 servlet。
servlet 不需要等待 servlet 结束,因为它不需要来自其响应的任何信息。
我可以生成一个新线程来调用网络服务吗?
会用 new Thread(callWSMethod()).start() 来完成吗?
如果不建议这样做,有什么更好的方法?
【问题讨论】:
标签: java web-services servlets java-threads
看起来 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();
【讨论】:
既然你不需要像UserTransaction这样的JEE资源,我觉得这样做就好了。但是,请务必阅读到最后。
在早期版本的 JEE 中,我记得不建议这样做,因为启动线程不会有托管资源和上下文,如 EJB、连接池、JTA 事务等。但是,我不确定它是否在 JEE7 中仍然不推荐。 JEE7 中仍有ManagedExecutorService 可用于此目的。
但是,我已经多次直接使用ExecutorService,没有任何问题,只要我不想要任何像前面提到的那样的托管资源。我一直使用ExecutorService,而不是直接使用Thread。唯一的“注意”是在处理结束时必须以某种方式关闭ExecutorService。
但许多人不同意这种方法。让我们也听听其他人的意见。
【讨论】: