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 ?
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. –