【问题标题】:CDI 2.0: How to check how many asynchronous events fired with Event.fireAsync() can run simultaneouslyCDI 2.0:如何检查使用 Event.fireAsync() 触发的异步事件可以同时运行多少
【发布时间】:2017-11-22 18:52:07
【问题描述】:

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

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

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

所以,我的问题是:

  1. 如何检查有多少线程可用于 CDI 事件的真正异步处理?
  2. 如何在异步观察者方法中查看有多少事件排队等待处理?

【问题讨论】:

    标签: java tomcat cdi weld cdi-2.0


    【解决方案1】:

    对于您的第一个问题 - 默认将基于可用的处理器。类似于Runtime.getRuntime().availableProcessors() + 1 的东西。 但是,您所追求的是我想的配置选项。在这里你可以选择,你可以:

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

    关于你的第二个问题 - 我不得不在这里让你失望。目前还没有办法在 Weld 中实现这一点。欢迎随时create a WELD Jira issue,您将来可能会看到它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      相关资源
      最近更新 更多