2016-10-20 5 views
0

Kann mir jemand sagen, wie man eine garantierte Lieferung mit camel-redisis durchführt?Kamel-garantierte Lieferung mit Redis

Mein Anwendungsfall ist so etwas wie unten: -

from("jetty:http://localhost:8888/hello").to("redis://...") 

Sobald die Nachricht einen Erfolg Reaktion auf http-Client Redis geschrieben senden, so dass der Kunde für die Antwort nicht blockiert wartet.

Dann in einem anderen Weg möchte ich die Nachricht von redis wie unten verarbeiten und sie dann aus redis löschen, wenn die Verarbeitung

from("redis://...").to(...) 
+0

Guter Ansatz - es heißt "Speichern und Weiterleiten" -Muster. Siehe http://redis.io/commands/rpoplpush. Was genau ist dein Problem mit der Implementierung des Musters? – gusto2

+0

Wie behandelt man den Fall, wenn nach dem Lesen der Nachricht von redis im Pfad 'from (" redis: // ") .to (...). To (...)' ein Fehler auftritt und die Nachricht nicht zugestellt wird zum endgültigen Bestimmungsort? Wie füge ich die Nachricht zur ursprünglichen Liste zurück? – tuk

+0

Wenn ich BRPOPLPUSH verwende und für eine Zeitüberschreitung keine Bestätigung erfolgt, verschiebe die Nachricht aus der Zielliste zurück in die ursprüngliche Liste. Wenn es eine Bestätigung gibt, löschen Sie die Nachricht. Können Sie vorschlagen, was der beste Weg ist, um dies mit Java dsl zu implementieren? – tuk

Antwort

1

Guter Ansatz erfolgreich ist - es heißt „Store and Forward“ -Muster.

und die Nachricht wird nicht an das endgültige Ziel geliefert?

dann - was ist mit dem "Versuch/fangen"? Versuchen Sie, die Nachricht zu senden, und wenn sie fehlschlägt, legen Sie sie einfach zurück auf die Redis.

Normalerweise wird dieses Muster unter Verwendung von Messaging (JMS) implementiert, wobei der Messaging einige wichtigen Funktionen ist mit: das Ziel, die Wiederholungsanzahl, wiederholt periode und die Warteschlange für unzustellbare usw.

Einfacher Speicher verwenden (redis, jdbc, ...) müssen Sie diese Messaging-Funktionen selbst implementieren. (Ich muss Admin ich bin nicht gut mit Redis, aber das gleiche Problem kommt mit der Verwendung von einfachen JDBC als Nachrichtenspeicher).

Fügen Sie mindestens die Wiederholungsanzahl und den "nächsten Lieferungs-Zeitstempel" hinzu. Und was passiert, wenn die Nachricht nicht nach einer vordefinierten Zählung geliefert wird - es liegt an Ihnen - senden Sie eine E-Mail, schreiben Sie ein Protokoll, stoppen Sie die Welt ..

+0

Ja 'versuchen/fangen' ist da. Ich habe nach dem Fall gefragt, wenn die Kamelinstanz nach dem Lesen der Nachricht von redis untergeht. – tuk

+1

Entweder, wenn die Endpunkte (redis, http) nicht vollständig transaktional sind. In diesem Fall haben Sie keine perfekte Lösung und Sie müssen Kompromisse eingehen. Sie können den Befehl redisction transaction verwenden oder das redis-Objekt nur löschen, wenn der Serviceaufruf erfolgreich ist. Im letzteren Fall sollte der Fernservice idempotent sein. – gusto2

Verwandte Themen