2008-09-17 6 views
10

Ich versuche, einige maßgeschneiderte Nachrichtenwarteschlangen mit ActiveMQ zu ersetzen, und ich muss mit ihnen (viel) von Perl sprechen. ActiveMQ bietet eine Stomp-Schnittstelle und Perl hat Net :: Stomp, also scheint es in Ordnung zu sein, aber das ist es nicht.Wie verwende ich Transaktionen mit Stomp und ActiveMQ (und Perl)?

Auch wenn ich einen BEGIN-Befehl über Stomp sende, werden die mit SEND gesendeten Nachrichten sofort veröffentlicht, und wenn ich die Transaktion abbringe, passiert nichts.

Ich kann keine klaren Antworten finden, die vorschlagen, dass es nicht möglich ist, das ist möglich, oder dass es ein relevantes bisschen Konfiguration gibt. Außerdem scheint Stomp kein großartiges Protokoll zu sein, um auf Fehlerreaktionen vom Server zu prüfen.

Bin ich kein Glück?

Antwort

3

BTW der beste Platz zum Fragen Perl/ActiveMQ/Stomp Fragen ist die ActiveMQ user forum wie viele Perl-Stomp Leute hängen da draußen.

Der Trick mit STOMP-Transaktionen besteht darin, sicherzustellen, dass jede gesendete Nachricht oder jede von Ihnen vorgenommene Bestätigung den Transaktions-ID-Header enthält. Siehe transaction handling section of the STOMP protocol.

Der Grund dafür ist, dass Sie mit STOMP viele Transaktionen gleichzeitig durchführen können, wenn Ihr Client multi-threaded ist - zusammen mit einigen nicht-transaktionierten Operationen.

+0

Ja, ich befolge die Stomp-Protokollregeln und sende einen Transaktionskopf. (Ich wünschte, ich könnte tcpflow auf dieser Maschine arbeiten lassen; tcpdump saugt, um zuzusehen, wie er stampft.) Ich werde dieses Forum auch versuchen, danke! – rjbs

1

Werfen Sie einen Blick auf Net::Stomp::Receipt. Es ist eine Unterklasse von Net :: Stomp, die "Return Quittungen" aus dem Stomp-Protokoll implementiert und Ihnen ermöglicht, den korrekten Empfang Ihrer Nachricht sicherzustellen und die Transaktion andernfalls abzubrechen.

1

Sie müssen die Bestätigungen innerhalb einer Transaktion umbrechen.

In Pseudo-Code (oder Pseudo-STOMP) dies wäre:

  • BEGIN [TRANSACTION-ID] ->
  • MESSAGE an den Server senden [MESSAGE-ID] (erhalten) < - vom Server empfangen
  • ACK [MESSAGE-ID] [TRANSACTION-ID] ->
  • an den Server senden
  • COMMIT [TRANSACTION-ID] -> an den Server senden

I habe schon das mit dem PHP-Treiber arbeiten (patchen den Abbruch-Aufruf, um die Transaktions-ID zu verwenden, wenn ich ein Rahmenobjekt zur Bestätigung übergebe).

Leider bleibt der Client nach der erneuten Zustellung von vier Nachrichten stehen. Zumindest passiert mir das.

+0

Wenn ich sage, ich habe eine while-Schleife, wäre dieser Pseudo-Code in der Schleife? oder wären BEGIN und ABORT draußen? – obsessiveCookie

+1

Sie würden innerhalb der Schleife sein, da Sie eine Transaktion für jede gesendete und empfangene Nachricht öffnen müssen. –

+0

würde die Transaktions-ID jedes Mal auf etwas anderes gesetzt werden? – obsessiveCookie

Verwandte Themen