2015-10-09 30 views
3

Java EE 7消息驱动Bean的此代码按预期接收消息,但无法发送答复,因为JMSContext始终为空。什么可能导致注射失败?我如何@在WildFly 10中注入JMSContext?

我曾尝试不同的方法来注入的背景下,具有和不具有额外@JMSConnectionFactory注释:

@JMSConnectionFactory("java:comp/DefaultJMSConnectionFactory") 

@JMSConnectionFactory("java:/ConnectionFactory") 

后者是在的所述JNDI屏幕中示出的值管理员网页界面。

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

答案很简单:默认情况下,容器不会在消息驱动bean中注入依赖关系。当我将@ApplicationScoped注释添加到bean类时,JMSContext将被注入。

+2

这不应是必需的。 –

+1

我同意约翰的观点,别的事情正在发生。我一直向MDB注入东西,没有任何额外的注释。 – teacurran

1

你这里有两种选择:

  1. 当你的豆用范围类型注释,服务器识别的应用程序作为一个bean存档,无需额外配置。

  2. CDI使用名为beans.xml的可选部署描述符。只有在某些有限的情况下(显式bean归档),归档文件必须包含beans.xml部署描述符,例如,当POJO类没有CDI注释时。

对于Web应用程序时,beans.xml的部署描述符,如果存在的话,必须在WEB-INF目录:web应用/ 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

Wild 1 1 0没有激活每个默认的JMS组件。该配置只是'standalone-full.xml'文件的一部分。 如果使用标准'standalone.xml'运行Wildfly,则应切换到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

我想添加[如何在jboss eap 7中配置jms](https://stackoverflow.com/questions/40015829/how-to-configure-jms-in-jboss-eap-7),因为它显示了如何在不使用standalone-full.xml的情况下,人们可能不想使用它,而只是更新standalone.xml以支持JMS – JGlass