在容器管理环境中使用Spring执行异步任务

时间:2016-04-27 07:29:15

标签: spring multithreading asynchronous threadpool spring-webflow

我想在Web应用程序中异步运行几个任务。我的问题是我应该在Container托管环境中使用哪个Spring执行任务执行器。

我参考了Spring文档中的this章节,发现了一些选项。

我考虑的一个选项是 WorkManagerTaskExecutor 。这非常简单,可以与我目前使用的IBM Websepher服务器无缝协作,但这非常适用于IBM Websphere和Oracle Weblogic服务器。我不想将我的代码专门绑定到一个特定的实现,因为在我们使用Jetty容器和放大器的一些测试和本地区域中。这个实现会产生在Jetty中运行代码的问题。

SimpleThreadPoolTask​​Executor 等其他选项似乎不适合在容器管理环境中利用线程池,我不想自己创建新线程。

你能否请求我如何解决这个问题。任何指向示例实现的指针都会有很大的帮助。

1 个答案:

答案 0 :(得分:0)

像往常一样,这取决于。如果您依赖容器的线程管理并希望能够在其管理界面上设置线程池,或者您的应用程序不是容器内的唯一应用程序,或者您使用特定功能(如为EJB或JMS设置线程池优先级)应该添加对WorkManagerTaskExecutor的支持并使其可配置。如果没有,你可以使用你想要的任何东西,最终线程只是线程。由于Spring是IOC容器,你可以做到。要在任何地方使用相同的应用程序,我不建议更改每个应用程序版本的XML配置。相反

  1. 使用profilesconfiguration来设置执行程序类型,并在java配置中返回正确的bean类型。如果您使用Jetty,您应该有一个线程池大小的配置,以便能够调整它。

  2. 使用spring boot like auto configuration,它通常依赖于类路径上的可用类(@ConditionalOnClass)。如果您的weblogic或websphere特定类可用或任何其他容器特定的东西,如env变量,您可以创建WorkManagerTaskExecutor

  3. 通过这两种方法,您可以在任何地方部署相同的战争。