消息驱动Bean选择器(JMS)

4

我最近发现了消息选择器

@ActivationConfigProperty(
        propertyName="messageSelector",
        propertyValue="Fragile IS TRUE")

我的问题是:如何在运行时使选择器动态化?

假设消费者决定只想要具有属性“Fragile IS FALSE”的消息。

消费者是否可以在不重新部署MDB的情况下更改选择器?

注意:我正在使用Glassfish v2.1。


我认为一个选项是获取MDB中的所有消息,并基于从数据库加载的某些配置使用编程筛选器。 - muasif80
我之前问过类似的问题,参见 https://stackoverflow.com/questions/48868136/dynamically-change-jmsselector# ,但并不完全符合你的问题。 - pikimota
2个回答

5
据我所知,这是不可能的。可能会有一些实现可以通过一些自定义服务器钩子来实现,但这取决于具体的实现方式。首先,它需要更改部署描述符,在EAR部署后不会被读取。

1
这真是令人恼火。如果你想要合规,就不能使用setMessageListener来获取异步消息。我正在尝试构建一个JMS测试应用程序,这让我感到非常愤怒。 :-/ - Chris K
消息驱动的Bean旨在使用简单而不灵活。如果您需要灵活性并在运行时修改选择器,则可以通过编程方式消耗消息。当您需要更改选择器时,应关闭现有的消费者并创建一个新的具有新选择器的消费者。 - OndroMih

1

JMS(Jakarta Messaging)旨在提供简单的方法来完成简单的事情,以及更复杂的方法来完成不太频繁需要的更复杂的事情。消息驱动的 bean 是第一种情况的一个例子。要进行一些动态重新配置,您需要停止使用 MDB 并开始使用编程 API 来消费消息,使用注入的 JMSContext 和主题或队列。例如:

    @Inject
    private JMSContext context;
    
    @Resource(lookup="jms/queue/thumbnail")
    Queue thumbnailQueue;

    JMSConsumer connectListener(String messageSelector) {
        JMSConsumer consumer = context.createConsumer(logTopic, messageSelector);
        consumer.setMessageListener(message -> {
            // process message
        });
        return consumer;
    }

您可以在启动期间调用connectListener,例如在CDI bean中:

public void start(@Observes @Initialized(ApplicationScoped.class) Object startEvent) {
    connectListener("Fragile IS TRUE");
}

然后,您可以通过关闭返回的消费者并使用新的选择器字符串再次创建它来轻松重新配置它:

consumer.close();
consumer = connectListener("Fragile IS FALSE");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接