2017-10-05 78 views
0

我试图开发一个“Message Driven Bean”来处理所有本地的ActiveMQ消息,但这是我第一次尝试做这样的事情。MessageDrivenBean不处理消息[Wildfly]

我发现的大部分材料都解释了如何使用JBOSS服务器编写MDB,在这种情况下,存在一个包含一些队列信息的xml文件,但在所有蜻蜓教程中都没有提及任何类型的配置。

我有以下情形:

  1. 一个简单的Java项目类似消息生产者

  2. 一个ActiveMQ的实例上运行的本地

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

} 

回答

0

也许你可以提供更多的信息,如带有队列信息和MDB注释属性的xml文件?因为这听起来你正朝着正确的方向前进。主要有两点:

您必须指定MDB正在侦听的确切队列,例如通过@MessageDriven注释的属性(例如“name”,“mappedName”,“activationConfig”)。当然,重写onMessage()方法来处理消息。

您还必须确保此特定队列可用作应用程序的资源。你必须为此提供jms配置,它也定义了资源类型(队列或主题)。从你的问题,我不能告诉你有哪些步骤(部分)完成。

+0

一切都完成了! 尽管在我的EJB 项目中没有XML /属性文件来指定ActiveMQ /队列。这是我的主要疑问之一,因为我发现 没有提及/指定属性文件来描述JMS详细信息的所有教程。 我刚刚创建了一个带有单个类的简单EJB项目,关于JMS的所有属性 都通过注释位于此类中。 –

+0

难道是资源适配器没有配置?见http://www.mastertheboss.com/jboss-server/jboss-jms/integrate-activemq-with-wildfly – OnlyEM