Java CDI 2.0:如何检查使用Event.fireAsync()触发的异步事件可以同时运行的数量
我正在使用Jersey、CDI2.0(Weld 3.0.1.final实现)和Tomcat编写RESTWeb服务。webservice的目标是启动长时间的计算任务,这些任务可以运行几分钟甚至几个小时。任务应该通过发送到webservice的HTTP POST请求启动,但是请求必须立即完成并将响应发送回客户端,而启动的任务应该在另一个线程上执行其工作 我已经通过使用CDI2.0及其允许异步处理事件的Java CDI 2.0:如何检查使用Event.fireAsync()触发的异步事件可以同时运行的数量,java,tomcat,cdi,weld,cdi-2.0,Java,Tomcat,Cdi,Weld,Cdi 2.0,我正在使用Jersey、CDI2.0(Weld 3.0.1.final实现)和Tomcat编写RESTWeb服务。webservice的目标是启动长时间的计算任务,这些任务可以运行几分钟甚至几个小时。任务应该通过发送到webservice的HTTP POST请求启动,但是请求必须立即完成并将响应发送回客户端,而启动的任务应该在另一个线程上执行其工作 我已经通过使用CDI2.0及其允许异步处理事件的Event.fireAsync()方法解决了这个问题。处理POST请求的JAX-RS资源类触发异步事
Event.fireAsync()
方法解决了这个问题。处理POST请求的JAX-RS资源类触发异步事件,然后由异步观察者方法(用@ObservesAsync
注释)在单独的@ApplicationScoped
CDIBean中处理该事件
所描述的解决方案非常有效。但是,我注意到,当我在异步事件中同时启动几个长任务时,只有四个任务在实际运行,而其余的任务在排队。一旦四个运行事件中的一个完成,队列中的第一个事件就开始处理
因此,我的问题是:
对于第一个问题,默认设置将基于可用的处理器。类似于
Runtime.getRuntime().availableProcessors()+1
的内容。
然而,我想您想要的是配置选项。在这里您可以选择,您可以:
- 使用焊接配置并从预定义选项中拾取
- 看看
- 我建议使用
pool(线程在不需要时不会逗留),此配置的键是FIXED_TIMEOUT
org.jboss.weld.executor.threadPoolType
- 您可以使用键
org.jboss.weld.executor.threadPoolSize
- 检查如何将配置选项传递到焊接
- 定义您自己的执行器,并使用
- (过度杀伤)实施自己的焊接SPI的一部分