2017-10-05 3 views
0

모든 로컬 ActiveMQ 메시지를 처리하기 위해 "Message Driven Bean"을 개발하려하고 있지만, 이와 같은 일을 처음 시도합니다.MessageDrivenBean이 메시지를 처리하지 않습니다. [Wildfly]

내가 찾은 자료의 대부분은 JBOSS 서버를 사용하여 MDB를 작성하는 방법을 설명합니다.이 경우 일부 대기열 정보가있는 xml 파일이 있지만 모든 wildfly 자습서에는 그런 종류의 구성에 대한 언급이 없습니다 .

  1. 메시지 생산과 같은 간단한 자바 프로젝트

  2. 의 ActiveMQ 인스턴스 실행 현지

  3. 는 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(); 
     } 
    } 

} 

답변

0

아마도 xml 파일과 같은 정보와 MDB의 주석 속성을 제공 할 수 있습니까? 그것은 당신이 옳은 방향으로 나아가고 있다고 들리기 때문입니다. 두 가지 주요 사항은 다음과 같습니다.

예를 들어, @MessageDriven 주석의 속성 (예 : "name", "mappedName", "activationConfig")을 통해 MDB가 수신 대기중인 정확한 대기열을 지정해야합니다. 물론 onMessage() 메서드를 재정 의하여 메시지를 처리해야합니다.

또한이 특정 큐를 응용 프로그램의 리소스로 사용할 수 있는지 확인해야합니다. 이를 위해 자원 유형 (대기열 또는 주제)을 정의하는 jms 구성을 제공해야합니다. 귀하의 질문에 나는 당신이 (부분적으로)이 단계 중 어느 것을 완료했는지 알 수 없습니다.

+0

모든 것이 완료되었습니다! 내 EJB 프로젝트에는 ActiveMQ/Queue를 지정하는 xml/등록 정보 파일이 없지만. 이것은 내가 찾은 모든 자습서가 언급되지 않았기 때문에/내 세부 사항 중 하나입니다. 언급하지 않았거나 JMS 세부 정보를 설명하는 속성 파일을 지정했습니다. 방금 ​​단일 클래스로 간단한 EJB 프로젝트를 만들었습니다. JMS에 대한 모든 속성 은 주석을 통해이 클래스에 있습니다. –

+0

리소스 어댑터가 구성되지 않았습니까? http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly를 참조하십시오. – OnlyEM

관련 문제