【问题标题】:Pipes and filters pattern with MDB in Java EEJava EE 中使用 MDB 的管道和过滤器模式
【发布时间】:2017-06-16 13:08:16
【问题描述】:

我正在尝试使用 Java EE 中的消息驱动 Bean 实现管道和过滤器模式,但我希望以队列可配置且 bean 在运行时创建的方式来实现。这样就可以轻松更改过滤器的执行顺序。

我是 Java EE 的新手,过去使用 MDB 时,我总是这样做:

@MessageDriven(mappedName = "jms/myQueue", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class ReceiveMessageBean implements MessageListener {

这不符合我的要求。

我正在考虑做一个每个过滤器都可以继承的 bean,这样我就可以将队列方法的读取和写入仅放在一个地方,如下所示:

public class StepBean {
    public void createBean(String queueRead, String queueWrite) {
        //make the bean listen from queueRead
        //make the bean write to queueWrite
    }
    public void onMessage(Message message){
        //get the message  from queueRead and transform it to my own class
        processMessage(myMessage);
    }

    public void processMessage(MyMessage message){
        //each filter should implement this method 
        sendMessage(myMessage);
    }

    public void sendMessage(MyMessage message){
        //send message to queueWrite
    }
}

然后在我的 ejb 中有某种工厂,它为队列创建具有所需值的步骤 bean。

但我几乎不知道如何做到这一点。我一直在查看this,但由于我的 bean 都从队列中读取和写入,因此它们并不是严格意义上的 MDB。

我正在使用 GlassFish 4.1.2 和 Netbeans 8.2。

欢迎任何有关如何执行此操作或是否可行的指导。

【问题讨论】:

    标签: java jakarta-ee ejb jms message-driven-bean


    【解决方案1】:

    您不能以编程方式创建 MDB,因为它们必须由服务器管理。如果要创建动态侦听器,请使用 MessageConsumersetMessageListener。根据您的设置,您需要从某个连接工厂访问Connection,然后创建会话、消费者,最后创建消息侦听器。可以使用消息选择器 = 您的过滤器创建消费者。一个简短的例子:

    ConnectionFactory conFactory = (ConnectionFactory) ic.lookup("java:/ConnectionFactory");//customize the jndi to match your server
    Connection connection = conFactory.createConnection();
    Queue myqueue = ic.lookup("java:/jms/queue/MyQueue");
    Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
    String messageSelector = "MY_MSG_PROPERTY = 'MY_FILTER_VALUE'";
    Consumer consumer = session.createConsumer(myqueue, messageSelector);
    
    consumer.setMessageListener(new MessageListener() {
        @Override
        public void onMessage(Message message) {
            //handle you message here
        }
    });
    

    使用这种方法,您可以使用不同的过滤器和不同的消息侦听器创建多个消费者。但请记住,这些侦听器不是容器管理的,如果您不再需要这些侦听器(关闭会话等),则需要处理资源清理/关闭。

    【讨论】:

    • 它有效,但我使用了MessageConsumer 而不是Consumer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2013-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 2011-06-10
    • 1970-01-01
    相关资源
    最近更新 更多