首页 > 解决方案 > JMSListener 选择器

问题描述

我有外部 JMS 生产者使用 header 属性向 ActiveMQ 发送消息domainSelector

当我试图在消费者身上过滤它时,我根本没有收到消息。当我禁用选择器时 - 它会带来所有域的所有消息(我不想要什么,我只需要我的域)

我在这里看到非常相似的问题,但从答案中我无法得出问题所在。它说,“一些位于生产者和消费者之间的组件,它应该只是转发消息。”

简化的外部生产者:

public abstract class BaseProducer {
    protected JmsTemplate jmsTemplate;​
    ....
    public Object doInJms(Session session, MessageProducer messageProducer) throws JMSException {
        // Create the message
        Message message;
        try {
            message = session.createTextMessage(messageData.toJson());
        } catch (JsonProcessingException e) {
         ....
        }
    
        .....
         message.setStringProperty("domainSelector", "SERVICE"); 
    
        }
    
        messageProducer.send(message,
                jmsTemplate.getDeliveryMode(),
                priority,
                jmsTemplate.getTimeToLive());
        return message;
    }    
}

我的消费者:
我已经打印到日志头属性,并在日志中得到它:

收到 JMS domainSelector SERVICE

@JmsListener(destination = "#{campaignFullDestination}",
      containerFactory = "jmsListenerContainerFactoryCampaign",
      selector = "domainSelector = 'SERVICE'")
public void campaignListener(CampaignStatusChangeEvent campaignStatusChangeEvent, @Header("domainSelector") String domainSelector) {
   logger.debug("received JMS message " + campaignStatusChangeEvent.toString());
   logger.debug("received JMS domainSelector " + domainSelector);
   otaCampaignFlowController.createCampaign(campaignStatusChangeEvent);
}​

@Bean
public JmsTemplate jmsTemplate(MessageConverter messageConverter, ConnectionFactory connectionFactory){
    JmsTemplate template = new JmsTemplate();
    template.setConnectionFactory(connectionFactory);
    template.setMessageConverter(messageConverter);
    template.setPubSubDomain(true);
    return template;
}​

标签: javajmsspring-jms

解决方案


推荐阅读