我正在使用Jersey,CDI 2.0(Weld 3.0.1.final实现)和Tomcat编写REST Web服务。 Web服务的目标是启动可以运行几分钟甚至几小时的长计算任务。应该使用发送到Web服务的HTTP POST请求启动任务,但是请求必须立即完成并将响应发送回客户端,而启动的任务应该在另一个线程上执行其作业。
我已经通过使用CDI 2.0及其Event.fireAsync()
方法解决了这个问题,允许异步处理事件。处理POST请求的JAX-RS资源类触发异步事件,然后由异步观察者方法(用@ObservesAsync
注释)在单独的@ApplicationScoped
CDI bean中处理。
所描述的解决方案效果很好。但是,我注意到,当我同时在异步事件中触发几个长任务时,其中只有四个实际上正在运行而其余的排队。只要四个运行事件中的一个结束,第一个排队事件就会开始处理。
所以,我的问题是:
答案 0 :(得分:2)
对于您的第一个问题 - 默认值将基于可用的处理器。类似Runtime.getRuntime().availableProcessors() + 1
的内容。
但是,你想要的是配置选项。在这里你可以选择,你可以:
FIXED_TIMEOUT
池(线程在不需要时不会延迟),此配置的密钥为org.jboss.weld.executor.threadPoolType
org.jboss.weld.executor.threadPoolSize
NotificationOptions
Executor
并触发异步事件
ExecutorServices
,这是Weld SPI的一部分对于你的第二个问题 - 我在这里不得不让你失望。目前还没有办法在Weld内实现这一目标。欢迎create a WELD Jira issue,您可能会在将来看到它。