2015-10-09 3 views
3

Этот код для ведомого bean bean-компонента Java EE 7 получает сообщения, как ожидалось, но не может отправлять ответы, поскольку JMSContext всегда равен нулю. Что может привести к отказу инъекции?Как мне включить JMSContext в WildFly 10?

Я пробовал разные способы, чтобы придать контекст, и без дополнительного @JMSConnectionFactory аннотацию:

@JMSConnectionFactory("java:comp/DefaultJMSConnectionFactory") 

или

@JMSConnectionFactory("java:/ConnectionFactory") 

Последнее значение, отображаемое на экране JNDI из admin веб-интерфейс.

package com.example.wf10mdb; 

import javax.annotation.Resource; 
import javax.ejb.ActivationConfigProperty; 
import javax.ejb.MessageDriven; 
import javax.inject.Inject; 
import javax.jms.JMSConnectionFactory; 
import javax.jms.JMSContext; 
import javax.jms.JMSException; 
import javax.jms.Message; 
import javax.jms.MessageListener; 
import javax.jms.TextMessage; 
import javax.jms.Topic; 

@MessageDriven(activationConfig 
     = { 
      @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), 
      @ActivationConfigProperty(propertyName = "destination", propertyValue = "java:app/jms/topic/ExampleTopic") 
     }) 
public class ChatMessageBean implements MessageListener { 

    @Override 
    public void onMessage(Message message) { 
     try { 

      final TextMessage textMessage = (TextMessage) message; 
      final String question = textMessage.getText(); 

      System.out.println(question); 

      if (null != question) { 
       switch (question) { 
        case "Hello World!": 
         respond("Hello, Test Case!"); 
         break; 
        case "How are you?": 
         respond("I'm doing well."); 
         break; 
        case "Still spinning?": 
         respond("Once every day, as usual."); 
         break; 
       } 
      } 
     } catch (JMSException e) { 
      throw new IllegalStateException(e); 
     } 
    } 

    @Resource(mappedName = "java:/jms/topic/ExampleTopic") 
    private Topic answerTopic; 

    @Inject 
    @JMSConnectionFactory("java:/ConnectionFactory") 
    JMSContext context; 

    public void respond(String txt) { 
     if (context == null) { 
      System.out.println("context is null"); 
      return; 
     } 

     try { 
      context.createProducer().send(answerTopic, txt); 
     } catch (Exception exc) { 
      exc.printStackTrace(System.out); 
     } 
    } 
} 

ответ

0

Ответ прост: контейнер по умолчанию не вводит зависимости внутри компонента, управляемого сообщением. Когда я добавляю аннотацию @ApplicationScoped к классу bean, JMSContext будет введен.

+2

Это не должно быть необходимостью. –

+1

Я согласен с Джоном, что-то еще происходит. Я постоянно добавляю вещи в MDB без каких-либо дополнительных аннотаций. – teacurran

1

У вас есть два варианта здесь:

  1. Когда ваши бобы аннотированные с типом области видимости, сервер распознает приложение как архив боба и не требуются никакие дополнительные настройки.

  2. В CDI используется дополнительный дескриптор развертывания с именем beans.xml. Архив должен содержать дескриптор развертывания beans.xml только в определенных ограниченных ситуациях (явный архив боба), например, когда класс POJO не имеет аннотаций CDI.

Для веб-приложений, дескриптор развертывания beans.xml, если таковые имеются, должны находиться в каталоге WEB-INF: WebApp/WEB-INF/beans.xml Для EJB модулей или JAR-файлы, бобах. XML дескриптор развертывания, если таковые имеются, должны находиться в каталоге META-INF: ресурсы/META-INF/beans.xml

Этот файл может быть пустым: what is the purpose of including empty beans.xml in CDI implemenations projects?

Упаковка CDI Применение: https://docs.oracle.com/javaee/7/tutorial/cdi-adv001.htm

2

Wildfly 1 0 не активировал компонент JMS по умолчанию. Эта конфигурация является частью файла «standalone-full.xml». Если вы запустите Wildfly со стандартным «standalone.xml», вы должны перейти в конфигурацию standalone-full.xml. Wildfly использует Apache ActiveMQ.

Это пример messagin-ActiveMQ конфигурации с очередью пользовательского теста:

.... 
     <profile> 
     ..... 
     <subsystem xmlns="urn:jboss:domain:messaging-activemq:1.0"> 
        <server name="default"> 
         <security-setting name="#"> 
          <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true"/> 
         </security-setting> 
         <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10"/> 
         <http-connector name="http-connector" socket-binding="http" endpoint="http-acceptor"/> 
         <http-connector name="http-connector-throughput" socket-binding="http" endpoint="http-acceptor-throughput"> 
          <param name="batch-delay" value="50"/> 
         </http-connector> 
         <in-vm-connector name="in-vm" server-id="0"/> 
         <http-acceptor name="http-acceptor" http-listener="default"/> 
         <http-acceptor name="http-acceptor-throughput" http-listener="default"> 
          <param name="batch-delay" value="50"/> 
          <param name="direct-deliver" value="false"/> 
         </http-acceptor> 
         <in-vm-acceptor name="in-vm" server-id="0"/> 
         <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/> 
         <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/> 
         <connection-factory name="InVmConnectionFactory" connectors="in-vm" entries="java:/ConnectionFactory"/> 
         <connection-factory name="RemoteConnectionFactory" connectors="http-connector" entries="java:jboss/exported/jms/RemoteConnectionFactory"/> 
         <pooled-connection-factory name="activemq-ra" transaction="xa" connectors="in-vm" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory"/> 

         <jms-queue name="testQueue" entries="jms/queue/test java:jboss/exported/jms/queue/test" /> 
        <jms-topic name="testTopic" entries="jms/topic/test java:jboss/exported/jms/topic/test" /> 
        </server> 
       </subsystem> 
     .... 
+0

Я хотел бы добавить [Как настроить jms в jboss eap 7] (https://stackoverflow.com/questions/40015829/how-to-configure-jms-in-jboss-eap-7), поскольку он показывает, как для этого, не используя standalone-full.xml, который люди не захотят использовать, вместо этого он просто обновляет standalone.xml для поддержки JMS – JGlass

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