java - Java EE 中 MDB 的管道和过滤器模式

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

我正在尝试使用 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。

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

最佳答案

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

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

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

关于java - Java EE 中 MDB 的管道和过滤器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44590064/

相关文章:

java - lucene中的searchAfter

java - 评级栏未出现

java - Eclipse 中 Java Web 应用程序的结构

jakarta-ee - Java EE 容器与 Web 容器

java - 在 Android 上使用 BridJ 时出现 UsatisfiedLinkError

java - 如何在不使用双引号而不是单引号的情况下打印特定字符串?

java - 运行 JNLP 文件时某些库不起作用

java - war 部署仅在远程服务器上失败,缺少 weld.weldclassIntrospector .beanmanager

java - 错误组装 EJB : META-INF/ejb-jar. ejbVersion 2.x 需要 xml

java - 使用 entitymanager 急切加载集合