0

我试图开发一个“消息驱动 Bean”来处理所有本地 ActiveMQ 消息,但这是我第一次尝试做这样的事情。

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

我有以下情况:

  1. 一个简单的java项目,比如消息生产者

  2. 本地运行的 ActiveMQ 实例

  3. 部署到 Wildfly 10 中的 EJB 项目

我的生产者项目能够将消息发送到 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();
        }
    }

}
4

1 回答 1

0

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

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

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

于 2017-10-05T16:18:17.103 回答