代码之家  ›  专栏  ›  技术社区  ›  Sandrew Cheru

JMSListener选择器不工作

  •  1
  • Sandrew Cheru  · 技术社区  · 8 年前

    我让一个JMS生产者发送两种消息:业务逻辑和心跳消息。目前,两者都由同一个接收器处理,但我现在正尝试使用选择器为每个接收器创建专用类。我遇到的问题是,每当我将选择器添加到接收器时,它就会停止接收消息。这是我到目前为止得到的。为了简单起见,我只添加了心跳代码:

    要发送此消息,我有以下信息:

    private void sendHeartBeat() {
        this.buildTemplate().send(new HeartbeatMessageCreator(this.someId));
    }
    
    private JmsTemplate buildTemplate() {
        if (this.cachedJmsTemplate == null) {
            final ActiveMQTopic activeMQTopic = new ActiveMQTopic(this.topic);
            this.cachedJmsTemplate = new JmsTemplate(this.config.getCachedConnectionFactory());
            this.cachedJmsTemplate.setDefaultDestination(activeMQTopic);
            this.cachedJmsTemplate.setPubSubDomain(true);
        }
        return this.cachedJmsTemplate;
    }
    

    HeartbeatMessageCreator:

    class HeartbeatMessageCreator implements MessageCreator {
    private final String someID;
    
    HeartbeatMessageCreator(final String someID) {
        this.someID = someID;
    }
    
    @Override
    public Message createMessage(final Session session) throws JMSException {
        final Serializable message = new ZHeartBeat(this.someID);
        final Message jmsMessage = session.createObjectMessage(message);
        jmsMessage.setJMSType(message.getClass().getName());
        jmsMessage.setStringProperty("InternalMessageType", "HeartBeat"); // <-- Setting my separator here
    
        return jmsMessage;
    }
    

    @Component
    public class MyListener {
    
        @JmsListener(destination = "${myTopic}", containerFactory = "myJmsContainer", selector = "InternalMessageType = 'HeartBeat'")
        public final void onMessage(final Message message) {
    
        ...
    
        }
    }
    

    在这种配置中,使用者从未看到消息进入,但如果我从@JmsListener注释中删除选择器部分,它们就会被传递。我不确定我在这里做错了什么。知道吗?

    1 回复  |  直到 8 年前
        1
  •  4
  •   Gary Russell    8 年前

    这对我来说很好。。。

    @SpringBootApplication
    public class So46453364Application implements CommandLineRunner {
    
        public static void main(String[] args) throws Exception {
            ConfigurableApplicationContext ctx = SpringApplication.run(So46453364Application.class, args);
            Thread.sleep(10_000);
            ctx.close();
        }
    
        @Autowired
        private JmsTemplate template;
    
        @Override
        public void run(String... arg0) throws Exception {
            this.template.convertAndSend("foo", "foo", m -> {
                m.setStringProperty("foo", "bar");
                return m;
            });
            this.template.convertAndSend("foo", "foo", m -> {
                m.setStringProperty("foo", "baz");
                return m;
            });
        }
    
        @JmsListener(destination = "foo", selector = "foo = 'bar'")
        public void bar(Message in) {
            System.out.println("bar: " + in);
        }
    
        @JmsListener(destination = "foo", selector = "foo = 'baz'")
        public void baz(Message in) {
            System.out.println("baz: " + in);
        }
    
    }
    

    bar: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:gollum.local-53472-1506533911909-4:3:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:gollum.local-53472-1506533911909-4:3:1:1, destination = queue://foo, transactionId = null, expiration = 0, timestamp = 1506533912140, arrival = 0, brokerInTime = 1506533912141, brokerOutTime = 1506533912144, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1030, properties = {foo=bar}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = foo}
    baz: ActiveMQTextMessage {commandId = 5, responseRequired = true, messageId = ID:gollum.local-53472-1506533911909-4:4:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:gollum.local-53472-1506533911909-4:4:1:1, destination = queue://foo, transactionId = null, expiration = 0, timestamp = 1506533912150, arrival = 0, brokerInTime = 1506533912150, brokerOutTime = 1506533912150, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = null, marshalledProperties = null, dataStructure = null, redeliveryCounter = 0, size = 1030, properties = {foo=baz}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = foo}