Java CDI 2.0:如何检查使用Event.fireAsync()触发的异步事件可以同时运行的数量

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资源类触发异步事

我正在使用Jersey、CDI2.0(Weld 3.0.1.final实现)和Tomcat编写RESTWeb服务。webservice的目标是启动长时间的计算任务,这些任务可以运行几分钟甚至几个小时。任务应该通过发送到webservice的HTTP POST请求启动,但是请求必须立即完成并将响应发送回客户端,而启动的任务应该在另一个线程上执行其工作

我已经通过使用CDI2.0及其允许异步处理事件的
Event.fireAsync()
方法解决了这个问题。处理POST请求的JAX-RS资源类触发异步事件,然后由异步观察者方法(用
@ObservesAsync
注释)在单独的
@ApplicationScoped
CDIBean中处理该事件

所描述的解决方案非常有效。但是,我注意到,当我在异步事件中同时启动几个长任务时,只有四个任务在实际运行,而其余的任务在排队。一旦四个运行事件中的一个完成,队列中的第一个事件就开始处理

因此,我的问题是:

  • 如何检查有多少线程可用于CDI事件的实际异步处理
  • 如何在异步观察者方法中检查排队等待处理的事件数

  • 对于第一个问题,默认设置将基于可用的处理器。类似于
    Runtime.getRuntime().availableProcessors()+1
    的内容。 然而,我想您想要的是配置选项。在这里您可以选择,您可以:

    • 使用焊接配置并从预定义选项中拾取
      • 看看
      • 我建议使用
        FIXED_TIMEOUT
        pool(线程在不需要时不会逗留),此配置的键是
        org.jboss.weld.executor.threadPoolType
      • 您可以使用键
        org.jboss.weld.executor.threadPoolSize
      • 检查如何将配置选项传递到焊接
    • 定义您自己的执行器,并使用
    • 过度杀伤)实施自己的焊接SPI的一部分
    关于你的第二个问题,我不得不让你失望。目前还没有办法在焊缝内实现这一点。请放心,您将来可能会看到它