【问题标题】:JMS 2 MDB listen to multiple queueJMS 2 MDB 监听多个队列
【发布时间】:2018-10-22 17:16:12
【问题描述】:

我在 Liberty 18.0.0.2 上使用 JavaEE 8。
我像这样设置 jms 激活配置(server.xml):

  <messagingEngine>
    <queue id="application" />
  </messagingEngine>
  <jmsActivationSpec id="app/appMDB">
    <properties.wasJms destinationRef="java:app/onlineQueue" />
  </jmsActivationSpec>   

这是我的简单 MDB 消息监听器:

@MessageDriven(
        name = "appMDB",
        mappedName = "java:app/onlineQueue",
        activationConfig = {
                @ActivationConfigProperty(propertyName = "destinationType",
                        propertyValue = "javax.jms.Queue"),
                @ActivationConfigProperty(propertyName = "destination",
                        propertyValue = "java:app/onlineQueue")
        }
)
public class ApplicationMessageListener implements MessageListener {
...
}

我还定义了两个这样的队列:

@Stateless
@JMSDestinationDefinitions(
        value = {
                @JMSDestinationDefinition(
                        name = "java:app/onlineQueue",
                        interfaceName = "javax.jms.Queue",
                        destinationName = "application"),
                @JMSDestinationDefinition(
                        name = "java:app/offlineQueue",
                        interfaceName = "javax.jms.Queue",
                        destinationName = "application")
        }
)
public class MessageService {

    @Inject
    private Logger logger;

    @Resource(lookup = "java:app/onlineQueue")
    private Queue onlineQueue;

    @Resource(lookup = "java:app/offlineQueue")
    private Queue offlineQueue;

    @Inject
    private JMSContext context;

    @EJB
    private MessageUtils messageUtils;

    public void sendToOnlineQueue(SimpleMessage simpleMessage) {
        TextMessage message = messageUtils.createTextMessage(simpleMessage);
        logger.info("Send online Message : " + simpleMessage);
        JMSProducer producer = context.createProducer();
        producer.send(onlineQueue, message);
    }

    public void sendToOfflineQueue(SimpleMessage simpleMessage) {
        TextMessage message = messageUtils.createTextMessage(simpleMessage);
        logger.info("Send offline Message : " + simpleMessage);
        JMSProducer producer = context.createProducer();
        producer.send(offlineQueue, message);
    }
}   

我的问题是 MDB 监听多个队列。
我希望 mdb 只听 onlineQueue 。
如何解决这个问题?

【问题讨论】:

  • 有什么证据表明 MDB 正在监听多个队列?
  • 我将消息发送到 offlilneQueue 但在线消息侦听器想要处理。
  • 您正在使用@JMSDestinationDefinition 的两个实例来定义两个队列,但它们都具有相同的destinationName(即application)。这对我来说似乎是错误的。此外,您的 MDB 正在使用名为 application@ActivationConfigProperty,这似乎也是错误的。这应该命名为destination
  • Opss,对不起,我更新了关于属性名称(目的地)的帖子。
  • 我很困惑!你说每个队列必须定义不同的目的地名称?

标签: java jms websphere-liberty open-liberty jms2


【解决方案1】:

您有两个不同的@JMSDestinationDefinition。一个具有java:app/onlineQueuename,另一个具有java:app/offlineQueue 的名称。但是,他们两个都有应用程序的destinationName,这对我来说似乎是错误的。无论您在 JNDI 中查找 java:app/onlineQueue 还是 java:app/offlineQueue,您都将获得对名为 application 的目的地的引用。这几乎就是为什么发送到java:app/offlineQueue 的消息会被 MDB 接收的原因。

【讨论】:

    猜你喜欢
    • 2014-10-20
    • 1970-01-01
    • 2013-09-12
    • 2011-08-18
    • 2020-01-01
    • 2015-09-18
    • 2020-09-03
    • 2013-06-16
    • 2012-03-27
    相关资源
    最近更新 更多