Ich fragte im Grunde dasselbe vor ein paar Monaten mit diesem Post: How should a Spring JMS listener handle a message with an empty payload?, aber alles, was ich bekam, war ein läppischer Kommentar, der darauf hindeutet, dass ich meinen Hörer neu schreibe, um zu tun, was ich will. Eine gültige Aussage, aber in meinen Augen unklar, da ich immer noch mit Spring-Boot klarkomme. Ich habe seitdem gelernt und möchte diese Frage direkter stellen (im Gegensatz zu einem Kopfgeld auf das alte).Spring JMSListener - Wie sollte es mit leeren Nutzlasten umgehen?
stelle ich eine kommentierte Bean-Klasse mit @Configuration
und @EnableJms
und meine Container Fabrik wie folgt aussieht:
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(mqConnectionFactory());
factory.setDestinationResolver(destinationResolver());
factory.setConcurrency("1");
factory.setErrorHandler(errorHandler());
factory.setSessionTransacted(true);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
return factory;
}
Und der Hörer wie folgt aussieht:
@JmsListener(id = "qID", destination = "qName")
public void processOrder(String message) {. . .}
Wie ich es verstehe, sobald die kommentierten Bean-Klasse wird durchgelaufen, die JMSListener
startet grundsätzlich (es sei denn, ich setze autoStartup
auf false), so verstehe ich nicht, wo und wann ich die Kontrolle über was oder wie die JmsListener
behandelt Dinge. Aus meiner Sicht läuft es "nur". Wenn also eine Warteschlange "\n"
oder nur eine leere Zeichenfolge enthält, löst der Listener eine Ausnahme aus. Speziell org.springframework.messaging.converter.MessageConversionException: No converter found to convert to class java.lang.String
. Und diese Ausnahme wird hinter die Kulissen geworfen. Ich nie die Chance bekommen, etwas im Inneren des Ich sah in SimpleMessageConverter
Zuhörer auszuführen, aber offenbar nicht, etwas zu sehen, das mich so etwas wie setIgnoreStringPattern()
zu sagen erlauben würde. Das gibt es offensichtlich nicht, aber das ist es, was ich brauche. Was vermisse ich? Gibt es eine Möglichkeit, die JmsListener
bestimmte Strings zu ignorieren?
Können Sie etwas mehr darüber erklären, warum Sie leere Nachrichten unterstützen müssen? –
@ JohnK Sicher. Wir haben also WebSphere MQ-Warteschlangen, in die andere Anwendungen schreiben. Mein Listener muss die Fehlerwarteschlangen im Auge behalten. Die Fehlerwarteschlangen enthalten sehr merkwürdige Nachrichten. Meine App zielt darauf ab, dies zu beheben, indem nutzlose Nachrichten identifiziert werden. Wie Newline-Zeichen, die in Warteschlangen gelangen, die nicht sein sollten. –
Ich weiß, dass dies Ihre Frage nicht beantwortet, aber wenn Sie Kontrolle darüber haben, was die anderen Apps in die Warteschlange schreiben, ist die beste Antwort vielleicht, sicherzustellen, dass die anderen Apps gültige Nachrichten schreiben? Es sei denn, Sie haben keine Kontrolle über sie in diesem Fall, vergiss es. –