【发布时间】:2015-04-04 09:37:17
【问题描述】:
我在 Glassfish V4.0 (build 89) 容器中运行的 Java 代码中调用 rabbitMQ 客户端(和 不是 服务器)以连接到另一台机器上的 rabbitmq 服务器。根据 rabbitmq 客户端文档,我们应该为 rabbitmq 连接提供一个 ManagedThreadFactory 实例来创建线程。
我尝试使用
注入 DefaultManagedThreadFactoryctx.lookup("java:comp/DefaultManagedThreadFactory")
失败了
在 SerialContext 中查找“java:comp/DefaultManagedThreadFactory”失败...
尝试 @Resource(lookup="concurrent/__DefaultManagedThreadFactory") 会导致 NPE。
我对 java EE 并不感兴趣,我只是将这个容器用作我的 jersey web 服务的前端。显然我需要做更多/不同的事情。但是,除了
http://javahowto.blogspot.in/2011/02/how-to-create-and-look-up-thread-pool.html
任何 Java EE 专家都可以告诉我正确的巫毒咒语来完成这项工作吗?
更新 1
@Resource(name = "concurrent/__defaultManagedThreadFactory")
ManagedThreadFactory threadFactory;
// set on rabbitmq connection Factory
factory.setThreadFactory(threadFactory);
java.lang.NullPointerException
at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1312)
at java.util.concurrent.ThreadPoolExecutor.<init>(ThreadPoolExecutor.java:1233)
at java.util.concurrent.Executors.newFixedThreadPool(Executors.java:114)
at com.rabbitmq.client.impl.ConsumerWorkService.<init>(ConsumerWorkService.java:36)
更新 2
axel - 我的情况没有什么特别之处。我正在看的是在 GFV4 中尝试一个 rabbitmq java 客户端。所以重现问题
- 你需要运行rabbitmq服务器
- 使用客户端代码连接到rabbitmq服务器,客户端代码是部署在GF上的战争的一部分
- 根据 rabbitmq 客户端 API 指南 (https://www.rabbitmq.com/api-guide.html) @see 自定义线程工厂部分。他们将线程实例化委托给 容器。
- rabbitmq java 客户端代码在 Github 上
我可以从 GF 管理控制台看到 ManagedThreadFactory 名称,所以它应该在那里。
更新-3
托管线程工厂和托管执行器服务可以使用 JNDI 定位。但是,无法将相同的资源注入使用 Jersey Web 服务的代码中。资源注入适用于一个简单的 servlet 示例(例如 Github 上的 java EE7 示例)
这是由于 jersey/Hk2/CDI/weld 等的相互作用造成的吗?我正在寻找关于为什么我不能进行资源注入的权威答案?
【问题讨论】:
标签: java glassfish java-ee-7 managedthreadfactory