Die Frage
Wie sollte man ActiveMQ
und <flow>
in Mule ESB 3.2
konfigurieren, um sicherzustellen, dass die aus der Warteschlange gezogene Nachricht korrekt von external CXF service
?
behandelt wird
Szenario
Ich habe einen CXF-Endpunkt, der eingehende Nachrichten so schnell wie möglich empfangen und an drei externe Dienste übertragen soll. Nennen wir sie EX1, EX2, EX3. Dies ist dank der in Mule 3.x eingeführten Komponente <all>
relativ einfach.
Die wichtigste Anforderung der gesamten Lösung besteht darin, sicherzustellen, dass jede empfangene Nachricht an alle drei CXF-Dienste übermittelt wird. Wir hatten also die Idee, jede eingehende Nachricht in Persistent JMS queues
(Q1, Q2, Q3) zu schreiben. Nachdem die Nachricht aus der Warteschlange Qn gelesen wurde, wird sie direkt an den entsprechenden EXn-Endpunkt und somit - externen Dienst übertragen.
Konfiguration
(Ich kann die vollständige Konfiguration auf Anfrage bereitstellen)
Wir haben den ActiveMQ-Broker wie hier hier konfiguriert und mit unserer <flow>
config verdrahtet. Alles scheint wie erwartet zu funktionieren. Ich habe JConsole mit meiner Anwendung verbunden, damit ich sehen kann, dass die Nachrichten vom Typ PERSISTENT sind und sie in richtigen Warteschlangen landen. Wenn alles glatt läuft - Nachrichten werden von allen drei Diensten EXn empfangen.
Tests
Das Problem tritt auf, wenn wir einen der Dienste ausschalten, sagen wir EX2, und starten den gesamten Server neu, um einen Fehler zu simulieren. Die Nachricht endet verloren (Ich denke, es ist nicht so hartnäckig, nicht wahr?).
Das Merkwürdigste ist - Wenn wir 10 Nachrichten gesendet haben, wenn der EX2 ausgefallen ist, werden nach dem Serverneustart 9 von ihnen ordnungsgemäß neu geliefert! Also denke ich, dass vielleicht nur 9 von diesen 10 Nachrichten richtig eingereiht wurden, während die eine immer wieder neu geliefert wurde, als der Server ausfiel.
Das lässt mich denken, dass der CXF-Endpunkt nicht mit Transaktionsunterstützung behandelt wird, was ich ehrlich gesagt nicht verstehen kann. Immerhin kann ich sehen, dass sich die Nachricht in der Warteschlange befindet, wenn versucht wird, sie erneut zuzustellen. Daher sollte sie beibehalten werden. Es ist eindeutig nicht, aber warum?
Meine eigenen Versuche
Ich habe einige Dinge ausprobiert, von denen keine funktioniert hat. Immer geht eine Nachricht verloren.
- Keine
<jms:transaction />
-Tags in den Flows verwenden - hat nicht funktioniert
- Starten der JMS-Transaktion nach Erhalt der Nachricht, Beitritt beim Senden an
<cxf:jaxws-client />
- Die Verwendung von XA mit JBoss und
<xa-transaction />
- funktionierte nicht
- Bereitstellung von
<default-exception-strategy>
config - Wenn ich mich erinnere, machte es die Dinge am schlimmsten
Jede Hilfe ist willkommen, danke.
KONFIG
AKTIVE MQ-KONFIGURATION
%Vor%
FLOW - Senden Sie eingehende Nachrichten an 3 Warteschlangen Qn
%Vor%
FLOW - behandelt die Zustellung von Qn zu EXn
%Vor%
ENDPOINTS - Deklaration der angegebenen Endpunkte
%Vor%