모든 로컬 ActiveMQ 메시지를 처리하기 위해 "Message Driven Bean"을 개발하려하고 있지만, 이와 같은 일을 처음 시도합니다.MessageDrivenBean이 메시지를 처리하지 않습니다. [Wildfly]
내가 찾은 자료의 대부분은 JBOSS 서버를 사용하여 MDB를 작성하는 방법을 설명합니다.이 경우 일부 대기열 정보가있는 xml 파일이 있지만 모든 wildfly 자습서에는 그런 종류의 구성에 대한 언급이 없습니다 .
메시지 생산과 같은 간단한 자바 프로젝트
의 ActiveMQ 인스턴스 실행 현지
는 EJB 프로젝트는 제이보스 (10)에 배치
나는 다음과 같은 시나리오를 가지고
내 프로듀서 프로젝트는 abl입니다. 전자 메시지를 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 세부 정보를 설명하는 속성 파일을 지정했습니다. 방금 단일 클래스로 간단한 EJB 프로젝트를 만들었습니다. JMS에 대한 모든 속성 은 주석을 통해이 클래스에 있습니다. –
리소스 어댑터가 구성되지 않았습니까? http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly를 참조하십시오. – OnlyEM