2 Stimmen

Langlebige Webservice-Architektur

Wir verwenden axis2 für die Erstellung unserer Webservices und einen Jboss-Server zur Ausführung der Logik all unserer Anwendungen. Wir wurden gebeten, einen Webservice zu erstellen, der mit einer Bean kommuniziert, die bis zu einer Stunde brauchen kann, um zu antworten (abhängig von der Größe der Anfrage), so dass wir nicht in der Lage wären, die Verbindung mit den Verbrauchern während dieser Zeit geöffnet zu halten.

Wir könnten einen asynchronen Webservice verwenden, aber das hat sich nicht so gut bewährt, also haben wir beschlossen, eine Bean zu implementieren, die die Logik hinter dem Webservice übernimmt, und diese Bean asynchron vom Dienst aufrufen zu lassen. Der Webservice generiert ein Token, das an den Verbraucher weitergegeben wird, und der Verbraucher kann damit den Status der Anfrage abfragen.

Die Fragen, die ich habe, sind:

  1. Wie kann ich den Status der Bean auf dem Jboss-Server abfragen, nachdem ich von der Methode des Dienstes, der die Bean erstellt hat, zurückgekehrt bin? Muss ich zustandsabhängige Beans verwenden?
  2. Kann ich zustandsabhängige Beans verwenden, wenn ich asynchrone Aufrufe von der Webservice-Seite aus durchführen möchte?

3voto

karoberts Punkte 9688

Ein anderer Ansatz ist die Verwendung von JMS und einer DB.

Der Prozess würde wie folgt ablaufen

  1. Beim Aufruf eines Webdienstes eine Nachricht in eine JMS-Warteschlange stellen
  2. Einfügen eines Datensatzes in eine DB-Tabelle und Rückgabe einer eindeutigen ID für diesen Datensatz an den Kunden
  3. In einer MDB, die auf die Warteschlange hört, rufen Sie die Bean
  4. Wenn die Bohne zurückkehrt, aktualisieren Sie den DB-Datensatz mit dem Status "Erledigt".
  5. Wenn der Client den Status abfragt, lesen Sie den DB-Datensatz und geben je nach Datensatz "Not Done" oder "Done" zurück.
  6. Wenn der Kunde anruft und der Datensatz "Erledigt" anzeigt, geben Sie "Erledigt" zurück und löschen den Datensatz.

Dieser Prozess ist etwas ressourcenintensiver, hat aber einige Vorteile

  • Eine dauerhafte JMS-Warteschlange stellt erneut zu, wenn Ihre Bean-Methode eine Ausnahme auslöst
  • Eine langlebige JMS-Warteschlange liefert erneut, wenn Ihr Server neu gestartet wird.
  • Durch die Verwendung einer DB-Tabelle anstelle von statischen Daten können Sie eine geclusterte oder lastverteilte Umgebung unterstützen.

1voto

skaffman Punkte 389758

Ich glaube nicht, dass Stateful Session Beans die Antwort auf Ihr Problem sind, sie sind für lang laufende Konversationssitzungen konzipiert, was nicht Ihr Szenario ist.

Meine Empfehlung wäre, eine Java5-artige ExecutorService Thread-Pool, der mit dem Befehl Testamentsvollstrecker Fabrikklasse:

  1. Wenn der Webdienst-Server initialisiert wird, erstellen Sie eine ExecutorService Instanz.
  2. Webdienstaufruf eingeht, erstellt der Handler eine Instanz von Abrufbar . Die Callable.call() Methode würde den eigentlichen Aufruf der Geschäftslogik-Bean vornehmen, in welcher Form auch immer.
  3. この Callable wird übergeben an ExecutorService.submit() die sofort eine Future Objekt, das das Endergebnis des Aufrufs darstellt. Die Website Executor wird beginnen, Ihre Callable in einem separaten Thema.
  4. Generieren Sie ein zufälliges Token, speichern Sie die Future in einem Map mit dem Token als Schlüssel.
  5. Rückgabe des Tokens an den Webdienst-Client (die Schritte 1 bis 4 sollten sofort erfolgen)
  6. Später tätigt der Webdienst-Client einen weiteren Aufruf, um das Ergebnis abzufragen, und übergibt dabei das Token
  7. Der Server sucht nach dem Future unter Verwendung des Tokens, und ruft get() über die Future mit einem Timeout-Wert, so dass nur eine kurze Zeit auf die Antwort gewartet wird. Die Website get() Aufrufs wird das Ausführungsergebnis von dem zurückgegeben, was der Callable aufgerufen werden.
    • Wenn die Antwort verfügbar ist, geben Sie sie an den Kunden zurück und entfernen die Future aus der `Map.
    • Andernfalls bitten Sie den Kunden, später wiederzukommen.

Das ist ein ziemlich robuster Ansatz. Sie können sogar die ExecutorService um die Anzahl der Aufrufe zu begrenzen, die gleichzeitig ausgeführt werden können, wenn Sie dies wünschen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X