在Servlet中启动新线程[重复]

问题描述 投票:0回答:2

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

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

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

是否可以通过new Thread(callWSMethod())。start()

完成>

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

java web-services servlets java-threads
2个回答
0
投票

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

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

但是,我已经做了很多次而没有直接对ExecutorService造成任何问题,只要我不希望像前面提到的那样有任何托管资源。我一直使用ExecutorService,而不是直接使用Thread。唯一的“监视”是在处理结束时必须以某种方式关闭ExecutorService

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


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();
© www.soinside.com 2019 - 2024. All rights reserved.