私はすべてのローカルActiveMQメッセージを処理するための "Message Driven Bean"を開発しようとしていますが、このようなことをやってみるのは初めてです。MessageDrivenBeanがメッセージを処理していません[Wildfly]
JBOSSサーバーを使ってMDBを書く方法を説明している資料の大部分は、この場合はいくつかのキュー情報を持つxmlファイルですが、すべてのwildflyチュートリアルでは、そのような構成には何の言及もありません。
メッセージプロデューサのような単純なJavaプロジェクト
アンActiveMQのインスタンス実行しているローカル
EJBプロジェクトがWildfly 10に展開
私は次のシナリオを持っています
私のプロデューサープロジェクトはablですeはActiveMQキューにメッセージを送りますが、この部分は動作しますが、EJBプロジェクトには@MessageDrivenアノテーションを持つTestMDBHandleという単一クラスしかありません。キューメッセージを受信するのに十分ですか? 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の プロジェクトにActiveMQ/Queueを指定するxml /プロパティファイルはありませんが、これは私の主な疑問の一つです。私が見つけたチュートリアルはすべて であり、JMSの詳細を記述するためにプロパティファイルを指定/指定していないからです。 私はちょうど1つのクラスを持つ単純なEJBプロジェクトを作成しました。すべてのプロパティー は、このクラスにアノテーションによって配置されています。 –
リソースアダプタが設定されていない可能性がありますか? http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildflyを参照してください。 – OnlyEM