Java EE中使用MDB的管道和过滤器模式

时间:2017-06-16 13:08:17

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

我正在尝试使用Java EE中的Message-Driven Beans实现管道和过滤器模式,但我希望以队列可配置且在运行时创建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。

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

1 个答案:

答案 0 :(得分:0)

您无法以编程方式创建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
    }
});

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