在Servlet中启动新线程

时间:2020-01-16 08:47:01

标签: java web-services servlets java-threads

我有一个servlet,它调用Web服务。

该servlet不需要等待servlet结束,因为它不需要响应中的任何信息。

我可以生成一个新线程来调用Web服务吗?

是否可以使用 new Thread(callWSMethod())。start() 完成?

如果不建议这样做,还有什么更好的方法?

2 个答案:

答案 0 :(得分:0)

由于您不需要像UserTransaction这样的JEE资源,因此我觉得这样做很好。但是,请务必阅读到最后。

在早期版本的JEE中,我记得不建议这样做,因为启动线程不会具有EJB,连接池,JTA事务等托管资源和上下文。但是,我不确定是否在JEE7中仍然不建议使用。 JEE7中仍然有ManagedExecutorService可用于此目的。

但是,只要我不想要任何托管资源(如前所述),我就直接ExecutorService做了很多次,而没有任何问题。我一直使用ExecutorService,而不是直接使用Thread。唯一的“监视”是在处理结束时必须以某种方式关闭ExecutorService

但是许多人不同意这种方法。我们也要听听其他人的话。

答案 1 :(得分:0)

看起来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();
相关问题