我从 Glassfish V4.0(build 89)容器中运行的 Java 代码内部调用 rabbitMQ 客户端(而不是服务器),以连接到另一台机器上的 rabbitmq 服务器。根据 rabbitmq 客户端文档,我们应该为 rabbitmq 连接提供一个 ManagedThreadFactory 实例来创建线程。
我尝试使用注入 DefaultManagedThreadFactory
ctx.lookup("java:comp/DefaultManagedThreadFactory")
那失败了
在 SerialContext 中查找“java:comp/DefaultManagedThreadFactory”失败...
尝试@Resource(lookup="concurrent/__DefaultManagedThreadFactory")会导致 NPE。
我对 java EE 并不感兴趣,我只是将这个容器用作我的球衣 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 示例)
这是由于球衣/Hk2/CDI/焊接等的相互作用吗?我正在寻找一个权威的答案来解释为什么我不能让资源注入工作?