此Java EE 7消息驱动bean的代码按预期接收消息,但无法发送回复,因为JMSContext始终为null。什么可能导致注射失败?
我尝试了不同的注入上下文的方法,无论是否有额外的@JMSConnectionFactory注释:
@JMSConnectionFactory("java:comp/DefaultJMSConnectionFactory")
或
@JMSConnectionFactory("java:/ConnectionFactory")
后者是管理员Web界面的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 :(得分:2)
Wildfly 10默认情况下未激活JMS组件。此配置只是'standalone-full.xml'文件的一部分。 如果使用标准“standalone.xml”运行Wildfly,则应切换到standalone-full.xml配置。 Wildfly正在使用Apache ActiveMQ。
这是一个带有自定义测试队列的messagin-activemq配置示例:
jq('#selector');
答案 1 :(得分:1)
这里有两个选项:
当您的bean使用范围类型进行批注时,服务器会将该应用程序识别为bean归档,并且不需要其他配置。
CDI使用名为beans.xml的可选部署描述符。存档必须仅在某些有限的情况下(显式bean存档)包含beans.xml部署描述符,例如,当POJO类没有CDI注释时。
对于Web应用程序,beans.xml部署描述符(如果存在)必须位于WEB-INF目录中:webapp / WEB-INF / beans.xml对于EJB模块或JAR文件,beans.xml部署描述符,如果存在,则必须位于META-INF目录:resources / 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 :(得分:0)
答案很简单:默认情况下,容器不会在消息驱动的bean中注入依赖项。当我将@ApplicationScoped注释添加到bean类时,将注入JMSContext。