javaee中带有MDB的管道和过滤器模式

javaee中带有MDB的管道和过滤器模式,java,jakarta-ee,ejb,jms,message-driven-bean,Java,Jakarta Ee,Ejb,Jms,Message Driven Bean,我试图用JavaEE中的消息驱动bean实现管道和过滤器模式,但我希望这样做,队列是可配置的,bean是在运行时创建的。这样,更改过滤器的执行顺序就很容易了 我对Java EE非常陌生,在过去使用MDB时,我总是这样做: @MessageDriven(mappedName = "jms/myQueue", activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyVal

我试图用JavaEE中的消息驱动bean实现管道和过滤器模式,但我希望这样做,队列是可配置的,bean是在运行时创建的。这样,更改过滤器的执行顺序就很容易了

我对Java EE非常陌生,在过去使用MDB时,我总是这样做:

@MessageDriven(mappedName = "jms/myQueue", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class ReceiveMessageBean implements MessageListener {
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
    }
}
这不符合我的要求

我想做一个每个过滤器都可以继承的bean,这样我就可以把read和write from queue方法放在一个地方,类似这样:

@MessageDriven(mappedName = "jms/myQueue", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue")
})
public class ReceiveMessageBean implements MessageListener {
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

但我几乎不知道该怎么做。我一直在研究,但由于我的bean都是从队列读写的,所以它们并不是严格意义上的MDB

我正在使用GlassFish 4.1.2和Netbeans 8.2


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

您不能通过编程方式创建MDB,因为它们必须由服务器管理。如果要创建动态侦听器,请使用
MessageConsumer
setMessageListener
。根据您的设置,您需要从一些连接工厂访问
连接
,然后创建会话、使用者,最后是消息侦听器。可以使用message selector=您的筛选器创建使用者。举个简单的例子:

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
    }
});

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

您不能通过编程方式创建MDB,因为它们必须由服务器管理。如果要创建动态侦听器,请使用
MessageConsumer
setMessageListener
。根据您的设置,您需要从一些连接工厂访问
连接
,然后创建会话、使用者,最后是消息侦听器。可以使用message selector=您的筛选器创建使用者。举个简单的例子:

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
它起作用了,但是我使用了
MessageConsumer
而不是
Consumer