代码之家  ›  专栏  ›  技术社区  ›  Bartek Małachowski

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

  •  2
  • Bartek Małachowski  · 技术社区  · 7 年前

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

    我已经使用CDI 2.0及其 Event.fireAsync() 允许异步处理事件的方法。处理POST请求的JAX-RS资源类触发异步事件,然后由异步观察者方法(用注释)处理该事件 @ObservesAsync )在单独的 @ApplicationScoped CDI bean。

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

    所以,我的问题是:

    1. 如何检查有多少线程可用于CDI事件的真正异步处理?
    2. 如何在异步观察方法中检查排队并等待处理的事件数?
    1 回复  |  直到 7 年前
        1
  •  2
  •   Siliarus    7 年前

    Runtime.getRuntime().availableProcessors() + 1 . 然而,我想你想要的是配置选项。在这里,您可以选择:

    • 使用焊接配置并从预定义选项中选择
      • 看看 configuration part of Weld doc
      • 我建议使用 FIXED_TIMEOUT 池(线程在不需要时不会逗留),此配置的关键是 org.jboss.weld.executor.threadPoolType
      • 您可以使用键设置所需的线程数 org.jboss.weld.executor.threadPoolSize
      • 检查 chapter 19.1 关于如何将配置选项传递给焊接
    • 定义自己的 Executor 并使用 NotificationOptions
    • ( )实现您自己的 ExecutorServices ,焊接SPI的一部分

    create a WELD Jira issue 你将来可能会看到。