【问题标题】:MessageDrivenBean isnt handle messages [Wildfly]消息驱动 Bean 不处理消息 [Wildfly]
【发布时间】:2017-10-06 02:41:44
【问题描述】:

我正在尝试开发一个“消息驱动 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();
        }
    }

}

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 一切都完成了!尽管在我的 EJB 项目中没有用于指定 ActiveMQ/Queue 的 xml/property 文件。这是我的主要疑问之一,因为我发现的所有教程都没有提到/指定一个属性文件来描述 JMS 细节。我刚刚创建了一个带有单个类的简单 EJB 项目,关于 JMS 的所有属性都位于该类中,通过注解。
    • 会不会是资源适配器没有配置好?见mastertheboss.com/jboss-server/jboss-jms/…
    猜你喜欢
    • 2017-08-04
    • 2018-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    • 2013-03-17
    相关资源
    最近更新 更多