【问题标题】:Message Driven Bean Selectors (JMS)消息驱动的 Bean 选择器 (JMS)
【发布时间】:2022-03-19 17:38:33
【问题描述】:

我最近发现了消息选择器

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

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

假设一个消费者决定他们只想要属性为“Fragile IS FALSE”的消息

消费者能否在不重新部署 MDB 的情况下以某种方式更改选择器?

注意:我使用的是 Glassfish v2.1

【问题讨论】:

  • 我认为一种选择是获取 MDB 中的所有消息并使用基于从数据库加载的某些配置的编程过滤器。
  • 我问过类似的问题,请参阅stackoverflow.com/questions/48868136/…,但不完全符合您的问题。

标签: java jakarta-ee jms jboss-mdb


【解决方案1】:

据我所知,这是不可能的。可能有一些实现将允许它通过一些自定义服务器挂钩,但这将取决于实现。一方面,它需要更改部署描述符,部署 EAR 后不会读取该描述符。

【讨论】:

  • 这很烦人。而且如果要合规,就不能使用 setMessageListener 来获取异步消息。我正在尝试构建一个 JMS 测试应用程序,这真让人生气。 :-/
  • 消息驱动的 bean 旨在简单易用且不灵活。如果您需要灵活性并在运行时修改选择器,您可以以编程方式使用消息。当您需要更改选择器时,您将关闭现有的消费者并使用新的选择器创建一个新的消费者。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-02-27
    • 2012-07-21
    • 2016-03-31
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 2017-08-04
    • 2018-02-10
    • 2021-04-17
    相关资源
    最近更新 更多