管理容器中的线程池的最佳实践是什么?

时间:2011-05-17 21:27:02

标签: java multithreading java-ee websphere

我需要能够在容器中实现两个线程化任务,并且需要了解执行此操作的最佳实践。以下是我需要完成的两类任务:

  1. 在Web服务调用期间,我需要启动一个在发送响应后继续处理的线程。处理完成后,不需要将消息发送回原始发件人。
  2. Web服务调用可能需要生成需要彼此并行运行的多个线程。应阻止对原始请求的响应,直到所有工作人员完成为止。响应的元素将来自每个线程结果的各个部分。
  3. 当然,我可以创建自己的java.util.concurrent.Executor实例并使用它,但我怀疑容器可能足够聪明,可以提供他们管理的容器。

    FWIW - 我在JDK 1.5.0上使用WebSphere 6.1(我知道,古老......但它就是这样)。我正在运行使用Apache CXF开发的Web服务,所以我在servlet容器中,但配置了Spring。

2 个答案:

答案 0 :(得分:1)

1)你可能想看看Asynchronous Beans。或者使用消息驱动Bean,它会拾取并处理您发送到队列的消息。你可能也想看看Spring的Quartz东西。我认为使用Servlet 3(在WAS 6.1上没有机会!)你可以在没有Async Work Manager或JMS方法的情况下获得异步支持,但在那之前我不知道比这些模式更好的方法。

对于2)通常阻止请求是一项有风险的业务(如果你达到超时怎么办)。但是,你在servlet容器中,所以你可以使用java.util.concurrent中的东西,例如正如你所提到的ExecutorService。或者使用消息传递将工作从其他地方发送出去并阻塞直到它完成。

答案 1 :(得分:0)

通常,我不会从容器内部启动线程,因为有可能打开j2ee完全合规性并且您的应用程序将会死亡。在完全合规下,不允许创建线程。您要做的是设置一个JMS队列,您将“要完成的工作”提交给该队列。然后,您可以让MDB监听队列,该队列执行您的线程可能执行的实际操作。