2015-02-04 1 views
4

Я звоню клиенту rabbitMQ (и не серверу) из моего кода Java, работающего в контейнере Glassfish V4.0 (сборка 89) для подключения к серверу rabbitmq на другом компьютере. Согласно клиентскому документу rabbitmq, мы должны предоставить экземпляр ManagedThreadFactory для соединения rabbitmq для создания потоков.Как создать экземпляр ManagedThreadFactory внутри Glassfish V4.0

Я попытался инъекционного DefaultManagedThreadFactory помощью

ctx.lookup ("Java: комп/DefaultManagedThreadFactory")

что не удалось с

Поиск неудавшегося для 'Java: COMP/DefaultManagedThreadFactory' в SerialContext ...

Попытка @Resource (lookup = "concurrent/__ DefaultManagedThreadFactory ") приводит к NPE.

Я не сильно разбираюсь в java EE, и я использую этот контейнер так же, как интерфейс для своих веб-сервисов. Ясно, что мне нужно сделать что-то большее/другое. Однако я был не в состоянии найти много кроме

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 сказать мне правильные Voodoo заклинаний, чтобы сделать эту работу?

Update-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) 

Update-2

аксель - нет ничего особенного о моем случае. То, что я просматриваю, просто пытается использовать java-клиент rabbitmq внутри GFV4. так, чтобы воспроизвести проблемы

  • Вам нужно запустить сервер RabbitMQ
  • подключиться к серверу, используя RabbitMQ код клиента, который является частью войны развертывается на GF
  • согласно RabbitMQ руководства клиента API (https://www.rabbitmq.com/api-guide.html) @see на заказ Раздел Thread Factory. Они делегируют реализацию потока в контейнер .
  • RabbitMQ код клиента Java на Github

Я могу видеть ManagedThreadFactory имя из консоли администратора GF поэтому она должна быть там.

обновление-3

Управляемый Factory Thread и управляемые услуги исполнителя могут быть расположены с помощью JNDI. Однако те же ресурсы не могут быть введены в мой код, который использует веб-службы Джерси. Инъекция ресурсов работает с простым примером сервлета (например, пример java EE7 на Github)

Это связано с некоторым взаимодействием трикотажа/Hk2/CDI/сварного шва и т. Д.? Я ищу официальный ответ на вопрос, почему я не могу сделать работу по введению ресурсов?

ответ

0

Я инъекционный по умолчанию удалось нить завод на подобном в своих проектах Java EE, работающих на Glassfish 4:

@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 
+0

Вы должны включить любую дополнительную баночку в вашем коде (скажем, внутри eclipse) для компиляции? Я могу попробовать это и дам вам знать. – rjha94

+0

Никаких дополнительных банок, просто стандартная ссылка для Java EE 7. Я использую Netbeans, кстати. –

+0

Я нахожусь на затмении, и мне нужно вручную скопировать файл java.enterprise.concurrent-api.jar. Возможно, мое затмение настроено. Позвольте мне попробовать это сейчас на GFV4. – rjha94

 Смежные вопросы

  • Нет связанных вопросов^_^