Frage

Eines unserer Produkte implementiert die folgenden Einweg Web-Service-Struktur:

Server <--------------------- Middleware <---------------- Client
        SOAP over JMS (queue)              SOAP over HTTP

In diesem Modell schicken Kunden SOAP-Nachrichten über HTTP auf unsere Middleware (Progress SonicMQ). Die Nachrichten geschoben bekommen in JMS-Warteschlangen von SonicMQ und unser Server holt sie von dort aus. wie Sie können jedoch sehen, der Server nicht eine Antwort an den Client (asynchrones JMS) senden.

Wir möchten einen Antwort-Kanal zu diesem Modell implementieren. Die häufig vorgeschlagene Lösung ist eine temporäre replyTo-Warteschlange (on the fly) in der Middleware zu schaffen, so dass Server eine Antwort auf diese Warteschlange zu senden. Dann kann, Client die Antwort abzurufen und die replyTo-Warteschlange geschlossen ist. Das klingt bequem genug, aber leider unsere Kunden operieren über einfaches HTTP und nicht über JMS, so dass ihre Kunden können replyTo Warteschlangen nicht einfach einrichten.

Ein Ansatz einen Antwortkanal in einem solchen Hybrid-HTTP zu erreichen / JMS SOAP-Modell wäre die Middleware zu konfigurieren, die auf jedem erfolgreichen SOAP die replyTo Warteschlange zu öffnen, erhalten, fügen Sie die replyTo-Warteschlange und Absenderinformationen an die SOAP-Nachricht und drücken Sie die Nachricht an die Warteschlange, wo sie von dem Server geholt werden würden. Nach dem Empfangen und Verarbeiten der Nachricht anzeigt, kann der Server eine Antwort auf die angezeigte replyTo-Warteschlange in der Middleware senden. Schließlich würde die Middleware die Antwort (SOAP) über HTTP senden zurück an den ursprünglichen Client durch die Daten aus der SOAP-Nachricht unter Verwendung (die Daten, die dort in dem Middleware-Verfahren eingeführt wurden, als der Antrag wurde zuerst empfangen).

Während propably möglich, klingt diese Art von Hacky. Die Frage ist also: alle sauberere Wege zur Erreichung solchen Request / Response-Modells auf unserem Fall? Der Server Ende wird in Java implementiert.

Die Lösung:

Fortschritt SonicMQ unterstützt HTTP Acceptor „Content senden Antworten“, die leicht Antwort JMS senden. Der Inhalt senden Antworten Akzeptor funktioniert auf folgende Weise:

  • Acceptor empfängt die HTTP-Nachricht ein Client
  • gesendet
  • Acceptor erstellt eine temporäre JMS-Warteschlange
  • Acceptor baut eine JMS-Nachricht auf, die HTTP-Körper enthält, und fügt die Identifikation des temporären Warteschlange auf die neu erstellte Nachricht JMS
  • Acceptor drückt die JMS-Nachricht in die Zielwarteschlange (nicht die temporäre Warteschlange)
  • Acceptor beginnt raubend die temporäre Antwort-To Warteschlange
  • Wenn Client-Nachricht von der ursprünglichen Zielwarteschlange abruft, es enthält die Menge Antwort Um die Identifizierung Warteschlange
  • Client verbraucht Nachricht
  • Client sendet die Antwort auf die Antwort-To Warteschlange
  • Acceptor erhält Nachricht aus der Warteschlange
  • Acceptor sendet Nachricht als HTTP an den Client, die ursprünglich die HTTP-Nachricht gesendet

Sollte der Verbraucher ( „Server“ in unserem Fall) fehlschlagen und nicht die Antwort verursacht Timeout, Sonics HTTP Acceptor sendet eine HTTP-Nachricht an den Client, die den Timeout senden. Dies ist ein sehr Standard-Feature in SonicMQ. Ich nehme an, es in anderen Produkten existiert auch.

Auf dieser Weise kann Standard SOAP über JMS Verwendung in dem "Server" Ende vermeidet jede kundenspezifische Programmierung in der Middleware (skaffman Antwort sehen).

ich noch einige Probleme im JMS-Modell sehe zwar, aber das ist definitiv eine Verbesserung.

Aktualisieren 2009-11-05:

Nach suchen dieses Problem noch, es stellt sich heraus, meinen Verdacht gegen HTTP <-> Middleware <->. JMS hat relevant

Es gibt einige kritische Probleme in diesem Modell. Synchron-Asynchron-Modell mit Middleware ist einfach nicht praktisch. Entweder haben beide Enden JMS-Verbindung implementieren (die rocken sollte) oder gehen mit HTTP in beiden Enden. Vermischen führt nur zu Kopfschmerzen. Von diesen beiden SOAP-over-HTTP ist einfacher und besser unterstützt als SOAP-over-JMS.

Noch einmal:. Wenn Sie diese Art von einem System entwerfen ... DO NOT

War es hilfreich?

Lösung

Ich glaube nicht, Ihre vorgeschlagene Lösung überhaupt hacken, ich denke, das ist die richtige Lösung. Sie haben die Client-Mittelschicht mit einem synchronen Protokoll, und dann der mittleren Serverschicht einer asynchrone Schicht verwendet wird, auf die Sie eine Antwort Weg zu geben, um die synchrone Semantik zu erfüllen. Das ist, was Middleware ist für. Denken Sie daran, dass die JMS bietet explizite Unterstützung für temporäre Antwort-Warteschlangen, werden Sie nicht mit der Nutzlast zu verwirren müssen.

Eine Linkauffangene Möglichkeit ist die Hebelwirkung der Tatsache, dass 1,2 SOAP mit JMS konzipiert wurde, und so konnte man Web-Service-Schicht zwischen Middleware und Serverschicht benutzen, dem SOAP-over-JMS tut. Das heißt, Sie SOAP von End-to-End, mit der Middleware-Wechsel nur den Transport halten.

Der einzige Web-Service-Stack, die ich kenne, unterstützt JMS-Transport ist Spring Web Dienstleistungen , wo der Prozess und Entwicklung ist

Andere Tipps

Warum nicht einen Link zu einer Seite hinzufügen, die Benutzer überprüfen, um zu sehen läßt, wenn eine Antwort bereit ist, a la Fed Ex Tracker-ID? Geben Sie Ihre Benutzer die Tracker-ID, wenn sie die Anfrage senden.

Das würde paßt in das HTTP-Request / Response-Idiom, und Ihre Benutzer würden noch wissen, dass die Anforderung „Feuer und vergessen“.

scroll top