2

我正在使用 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单独的@ApplicationScopedCDI bean 中的异步观察者方法(用 注释)处理。

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

所以,我的问题是:

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

1 回答 1

2

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

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

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

于 2017-11-23T09:15:04.957 回答