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

Asynchronous task execution using Spring in container managed environment

我想 运行 在 Web 应用程序中异步执行一些任务。我的问题是我应该在容器管理的环境中使用哪个 Spring 任务执行器的实现。

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

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

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

请问我该怎么做。任何指向示例实现的指针都会有很大帮助。

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

  1. 使用 profiles with configuration 设置执行程序类型,并在 java 配置中 return 正确的 bean 类型。如果你使用 Jetty,你应该有一个线程池大小的配置,以便能够对其进行调整。

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

有了这两个,您就可以在任何地方部署相同的 war。