4

我从 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 服务的前端。显然我需要做更多/不同的事情。但是,除了

https://blogs.oracle.com/arungupta/entry/create_managedexecutorservice_managedscheduledexecutorservice_managedthreadfactory_contextservice

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/焊接等的相互作用吗?我正在寻找一个权威的答案来解释为什么我不能让资源注入工作?

4

1 回答 1

1

我在 Glassfish 4 上运行的 Java EE 项目中注入了这样的默认托管线程工厂:

@Singleton
@Startup
public class Messenger {
    @EJB
    MyMessenger me;

    @Resource(name = "concurrent/__defaultManagedThreadFactory")
    ManagedThreadFactory threadFactory;

    @Resource
    ManagedExecutorService executorService;

    @PostConstruct
    public void postConstruct() {
        me.waitAndInitialize();
    }

    @Asynchronous
    public Future<?> waitAndInitialize() {
        try {
            final AtomicInteger done = new AtomicInteger(0);
            int i = 0;

            while (done.intValue() == 0 && i < 20) {
                i++;
                getExecutorService().submit(
                        new Runnable() {

                            @Override
                            public void run() {
                                int incrementAndGet = done.incrementAndGet();
                            }
                        });

                Thread.sleep(500);
            }

            if (done.intValue() == 0) {
                Logger.getAnonymousLogger().severe("Waited a long time for the ExecutorService do become ready, but it never did. Will not initialize!");
            } else {
                init();
            }
        } catch (Exception e) {
            Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Exception in waitAndInitialize: " + e.getMessage(), e);
        }

        return new AsyncResult<>(null);
    }

    protected void init() {
        connectionFactory.setExecutorService(executorService);
        connectionFactory.setThreadFactory(threadFactory);

        // connect to rabbit and listen to queues
    }
}

的输出asadmin list-containers

List all known application containers
resources_ear
resources
ejb
weld
weld
grizzly
web
connector
webservices
appclient
jpa
jpa
ear
osgi
security
于 2015-02-05T07:22:04.383 回答