我正在尝试开发一个"消息驱动Bean"处理所有本地ActiveMQ消息,但这是我第一次尝试这样做。
我发现的大部分材料都解释了如何使用JBOSS服务器编写MDB,在这种情况下,有一些带有一些队列信息的xml文件,但是在所有的wildfly教程中都没有提及任何类型的配置。
我有以下情况:
一个简单的java项目,如消息生成器
运行本地
部署到Wildfly 10中的EJB项目
我的生产者项目能够向ActiveMQ队列发送消息,这部分是可行的,但我的EJB项目只有一个名为TestMDBHandle的类,带有@MessageDriven注释。这足以接收我的队列消息吗?因为MDB不起作用,我想在EJB中必须是一种配置或属性来指定消息代理的主机。
我的留言制作人:
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属性位于我的生产者项目
中java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
java.naming.provider.url=tcp://localhost:61616
connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactory
queue.MyQueue=jms/myqueue
最后,我的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();
}
}
}
答案 0 :(得分:0)
也许您可以提供更多信息,例如带有队列信息的xml文件和MDB的注释属性?因为听起来你正朝着正确的方向前进。两件主要的事情:
您必须指定MDB正在侦听的确切队列,例如通过@MessageDriven注释的属性(例如" name"," mappedName",&# 34; activationConfig&#34)。当然,重写onMessage()方法来处理消息。
您还必须确保此特定队列可用作应用程序的资源。您必须为此提供jms配置,它还定义资源类型(队列或主题)。从你的问题我无法分辨你(部分)完成了哪些步骤。