我試圖開發一個「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();
}
}
}
一切都完成了! 儘管在我的EJB 項目中沒有XML /屬性文件來指定ActiveMQ /隊列。這是我的主要疑問之一,因爲我發現 沒有提及/指定屬性文件來描述JMS詳細信息的所有教程。 我剛剛創建了一個帶有單個類的簡單EJB項目,關於JMS的所有屬性 都通過註釋位於此類中。 –
難道是資源適配器沒有配置?見http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly – OnlyEM