2017-06-29 2 views
1

Mein Setup:
Ich habe eine Nachricht Daemon ActiveMQ mit denen JSON-Nachrichten konsumieren.
Der Herausgeber von JSON-Nachrichten fügt type header mit Wert hinzu, z. B. com.example.Foo welcher der Typ der JSON-Nachricht ist. Ich benutze dies um json in pojo zu verwandeln.Frühling Integration - Ausnahmen und Wiederholungen

Frühling config:
Sobald die Nachricht empfangen wird, das sind die Schritte, die sie durchgeht:
1. Transformator: Wandelt json
2. Payload Typ Router Pojo: Basierend auf den Typ des pojo , leitet den Pojo zu einem geeigneten Dienstaktivator.
3. Serviceaktivator: Verarbeitet die Nachricht.

<int:chain input-channel="transformerChannel"> 
    <int:transformer id="jsonToPojoTransformer" ref="JsonToPojoTransformer" method="transform" /> 

    <int:payload-type-router default-output-channel="defaultChannel"> 
     <int:mapping type="com.example.Foo" channel="fooHandlerChannel"/> 
     <int:mapping type="com.example.Bar" channel="barHandlerChannel"/> 
    </int:payload-type-router> 
</int:chain> 

<int:service-activator input-channel="fooHandlerChannel" ref="fooHandler" method="onMessage"/> 
<int:service-activator input-channel="barHandlerChannel" ref="barHandler" method="onMessage"/> 

Service-Aktivator Definition:

public class FooHandler { 
    public void onMessage(Foo foo) {...} 
} 

Problem:

  1. Ich möchte wissen, wie die Nachrichten-Header in den Dienst Aktivator zuzugreifen. Es scheint, als hätte der Dienstaktivator keinen Zugriff auf die Nachrichtenheader, da der Transformer ein Pojo zurückgibt.

  2. Nehmen wir an, der Service-Aktivator kann aus irgendeinem Grund keinen Downstream-Rest-Service aufrufen. Ich möchte die Verarbeitung dieser Nachricht jetzt überspringen und diese Nachricht später erneut versuchen. Oder sagen wir, es gab eine Ausnahme bei der Verarbeitung dieser Nachricht. Ich möchte die Verarbeitung dieser Nachricht nach einiger Zeit wiederholen. Wie erreiche ich das?

--edit--
entfernt Details Frage Größe wie pro Artem Kommentar zu reduzieren.

Antwort

0

Bitte versuchen Sie nicht so lange Themen hier in SO. Es ist schwierig, eine bestimmte Frage zu beantworten, wenn es viele gibt.

Absolut nicht klar, warum Sie nicht Zugriff auf Header von Ihrem Service-Aktivator-Methode erhalten können. Sie können das ganze Message<> akzeptieren und die getHeaders(). You can use @Headers annotation on the Karte arg to get headers from the message. You can use @ Header` Annotation aufrufen, um genau bestimmte Header aus der Nachricht zu extrahieren.

Auch wenn Ihre Transformer-Methode nur einen POJO zurückgibt, bedeutet das nicht, dass sie nicht mit den Headern von requestMessage in die Message eingebunden ist. Wenn Sie zusammen mit Ihrem POJO bestimmte Header zurückgeben müssen, sollten Sie Message selbst erstellen, indem Sie MessageBuilder verwenden und vergessen Sie nicht, readMessage-Header zu kopieren, nur weil der Transformer keine Request-Header kopiert, wenn die gesamte Nachricht zurückgegeben wird.

Sie müssen TX auf Ihrem JMS-Consumer unterstützen, so dass RuntimeException zu dem Rollback führen und daher später erneut liefern. Und Sie sollten sicherstellen, dass der gesamte Fluss im selben Thread ausgeführt wird. Andernfalls wird TX festgeschrieben und die Nachricht wird auf dem Broker angekreuzt. Das gleiche passiert, wenn Sie keine Transaktionen haben.

+0

Mein Dienstaktivator wurde definiert als 'public void fooHandler (Foo foo) {...}'. Daher habe ich mich gefragt, wie man auf die Header zugreift.Ich habe es in 'public void fooHandler (Nachricht Nachricht) {...}' geändert. Jetzt hat die Nutzlast eine Instanz von "Foo" und die Nachrichtenheader sind verfügbar. Ich war mir nicht bewusst, dass was Transformator zurückkehrt auch in "Message" verpackt ist. Und ich fügte weitere Details hinzu, um zu erklären, warum ich tat, was ich tat. Viele Male fragen Menschen, warum ich eine bestimmte Art und Weise gewählt habe, etwas zu tun. Daher die ausführliche lange Nachricht. – shravanp

+0

OK. Vielleicht ist das nur der Effekt des Abends :-). Ist meine Antwort nützlich oder brauchen Sie noch etwas? –

+0

Ich versuche, auf der Verbraucherseite Frühjahrsdokumentation über das TX zu finden. Kannst du mich auf die richtige Dokumentation hinweisen? Ich bin immer noch auf der Suche nach der massiven Referenz für die Integration von Federn. – shravanp

Verwandte Themen