MessageDrivenBean不处理消息[Wildfly]

时间:2017-10-05 01:17:16

标签: java jms wildfly message-queue jboss-mdb

我正在尝试开发一个"消息驱动Bean"处理所有本地ActiveMQ消息,但这是我第一次尝试这样做。

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

我有以下情况:

  1. 一个简单的java项目,如消息生成器

  2. 运行本地

  3. 的ActiveMQ实例
  4. 部署到Wildfly 10中的EJB项目

  5. 我的生产者项目能够向ActiveMQ队列发送消息,这部分是可行的,但我的EJB项目只有一个名为TestMDBHandle的类,带有@MessageDriven注释。这足以接收我的队列消息吗?因为MDB不起作用,我想在EJB中必须是一种配置或属性来指定消息代理的主机。

    我的留言制作人:

    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属性位于我的生产者项目

    java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory
    java.naming.provider.url=tcp://localhost:61616
    connectionFactoryNames = connectionFactory, queueConnectionFactory, topicConnectionFactory
    queue.MyQueue=jms/myqueue
    

    最后,我的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();
            }
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

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

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

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