2017-09-27 14 views
0

私はJMSプロデューサに2種類のメッセージ、つまりビジネスロジックとハートビートメッセージを送信しています。現在、どちらも同じレシーバーで処理されていますが、セレクターを使用して専用のクラスを用意しようとしています。私が持っている問題は、レシーバーにセレクターを追加するたびにメッセージの受信を停止することです。ここまで私がこれまで持っていたことがあります。簡単にするために、私は唯一のハートビート用のコードを追加しました:JMSListenerセレクタが動作しません

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) { 

    ... 

    } 
} 

この構成では、コンシューマはメッセージを受信することはありませんが、sele @ JmsListenerアノテーションのctor部分は、配信されます。私はここで何が間違っているのか分かりません。何か案が ?

答えて

0

それはあなたが絶対的に正しいです

@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} 
+0

...私のために正常に動作します。私の場合、問題を発見しました。プロデューサとコンシューマの間にコンポーネントがあり、メッセージを単に転送することになっていました。しかし、それが行われた方法は、メッセージのプロパティが最終的な宛先に到達していないことを意味しました。あなたの時間Thx。 –

関連する問題