MessageDrivenBean不处理消息[Wildfly]
问题描述:
我试图开发一个“Message Driven Bean”来处理所有本地的ActiveMQ消息,但这是我第一次尝试做这样的事情。MessageDrivenBean不处理消息[Wildfly]
我发现的大部分材料都解释了如何使用JBOSS服务器编写MDB,在这种情况下,存在一个包含一些队列信息的xml文件,但在所有蜻蜓教程中都没有提及任何类型的配置。
我有以下情形:
一个简单的Java项目类似消息生产者
一个ActiveMQ的实例上运行的本地
EJB项目部署到Wildfly 10
我的生产者项目是abl e将消息发送到ActiveMQ队列,这部分工作正常,但我的EJB项目只有一个叫做TestMDBHandle的类,带有@MessageDriven注解。这足以接收我的队列消息吗?由于MDB不起作用,我想必须是EJB中的一种配置或属性来指定消息代理的主机。
我的消息生产者:位于我的制片人项目
java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactory
queue.MyQueue=jms/myqueue
内
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public class MessageSender {
public static void main(String args[]) throws NamingException, JMSException {
MessageSender sender = new MessageSender();
sender.sender();
}
public void sender() throws NamingException, JMSException {
InitialContext jndi = null;
Session session = null;
Connection connection = null;
try {
jndi = new InitialContext();
ConnectionFactory factory = (ConnectionFactory)jndi.lookup("connectionFactory");
connection = factory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = (Destination)jndi.lookup("MyQueue");
MessageProducer producer = session.createProducer(destination);
TextMessage mensagem = session.createTextMessage("Eu enviei uma mensagem!");
producer.send(mensagem);
} catch (Exception e) {
e.printStackTrace();
} finally {
session.close();
connection.close();
jndi.close();
}
}
}
我的JMS属性最后,我的EJB项目有这样的一个类,没有任何形式的属性文件或XML的。
package br.com.jms.mdb;
import javax.annotation.Resource;
import javax.ejb.ActivationConfigProperty;
import javax.ejb.EJB;
import javax.ejb.MessageDriven;
import javax.ejb.MessageDrivenContext;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
@MessageDriven(name = "meuHandler", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/myqueue") })
public class Teste implements MessageListener {
@Resource
private MessageDrivenContext mdctx;
public Teste() {
}
@Override
public void onMessage(Message message) {
TextMessage objectMessage = null;
try {
objectMessage = (TextMessage)message;
System.out.println("Achei a mensagem : " + objectMessage.getText().toString());
}catch(JMSException e) {
e.printStackTrace();
}
}
}
答
也许你可以提供更多的信息,如带有队列信息和MDB注释属性的xml文件?因为这听起来你正朝着正确的方向前进。主要有两点:
您必须指定MDB正在侦听的确切队列,例如通过@MessageDriven注释的属性(例如“name”,“mappedName”,“activationConfig”)。当然,重写onMessage()方法来处理消息。
您还必须确保此特定队列可用作应用程序的资源。你必须为此提供jms配置,它也定义了资源类型(队列或主题)。从你的问题,我不能告诉你有哪些步骤(部分)完成。
一切都完成了! 尽管在我的EJB 项目中没有XML /属性文件来指定ActiveMQ /队列。这是我的主要疑问之一,因为我发现 没有提及/指定属性文件来描述JMS详细信息的所有教程。 我刚刚创建了一个带有单个类的简单EJB项目,关于JMS的所有属性 都通过注释位于此类中。 –
难道是资源适配器没有配置?见http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly – OnlyEM