我正在使用 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 中的异步观察者方法(用 注释)处理。
所描述的解决方案效果很好。但是,我注意到,当我在异步事件中同时触发几个长任务时,实际上只有四个在运行,而其余的则在排队。一旦四个正在运行的事件之一完成,第一个排队的事件就会开始处理。
所以,我的问题是:
- 如何检查有多少线程可用于 CDI 事件的真正异步处理?
- 如何在异步观察者方法中检查有多少事件排队等待处理?