【问题标题】:How to create ManagedThreadFactory instance inside Glassfish V4.0如何在 Glassfish V4.0 中创建 ManagedThreadFactory 实例
【发布时间】:2015-04-04 09:37:17
【问题描述】:

我在 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 并不感兴趣,我只是将这个容器用作我的 jersey 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 示例)

这是由于 jersey/Hk2/CDI/weld 等的相互作用造成的吗?我正在寻找关于为什么我不能进行资源注入的权威答案?

【问题讨论】:

    标签: java glassfish java-ee-7 managedthreadfactory


    【解决方案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
    

    【讨论】:

    • 您是否需要在代码中包含任何额外的 jar(比如在 eclipse 中)进行编译?我可以试试这个,然后告诉你。
    • 没有额外的 jars,只是 Java EE 7 的标准参考。顺便说一下,我正在使用 Netbeans。
    • 我在eclipse上,我必须手动复制java.enterprise.concurrent-api.jar。也许我的日食的设置方式。现在让我在 GFV4 上试试吧。
    • 嗨@per-axel-felth 尝试使用默认托管线程工厂时仍然得到 NPE。我不能要求你在你的 GFV4 中尝试 rabbitmq,可以吗;)
    • 嗨 axel,你能从你的机器上发布 $asadmin list-containers 的输出吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-10-14
    • 1970-01-01
    相关资源
    最近更新 更多