2017-09-27 3 views
0

J'ai un producteur JMS qui envoie deux types de messages: la logique métier et les messages de rythme cardiaque. Actuellement, les deux sont traités par le même récepteur, mais j'essaie maintenant d'avoir des classes dédiées pour chacun en utilisant des sélecteurs. Le problème que j'ai est quand j'ajoute le sélecteur au récepteur, il cesse de recevoir des messages. Voici ce que j'ai jusqu'ici. Pour simplifier, je n'ai ajouté le code pour le rythme cardiaque:Le sélecteur JMSListener ne fonctionne pas

Pour envoyer le message, j'ai ceci:

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; 
} 

Le consommateur est la suivante:

@Component 
public class MyListener { 

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

    ... 

    } 
} 

Dans cette configuration, le consommateur ne voit jamais les messages entrants, mais si je supprime le sele ctor partie de l'annotation @JmsListener, ils sont livrés. Je ne suis pas sûr de ce que je fais mal ici. Une idée ?

Répondre

0

Il fonctionne très bien pour moi ...

@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); 
    } 

} 

résultat

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

Vous êtes tout à fait raison. J'ai trouvé le problème dans mon cas: il y avait un composant entre le producteur et le consommateur, qui était supposé simplement transmettre les messages. Mais la façon dont cela a été fait signifiait que les propriétés du message n'atteignaient pas la destination finale. Merci pour votre temps. –