Ich arbeite an einem RESTful-Webservice, der Folgendes tut:
- Bei einer POST-Anfrage startet er eine langlaufende Aufgabe. Er fügt eine Nachricht in die MSMQ-Warteschlange ein, die in der Windows-Dienst gehosteten Anwendung verarbeitet wird. Er gibt den HTTP-Statuscode 202 Accepted zusammen mit der ID des von uns eingereihten Jobs zurück.
- Die Client-Anwendung ruft den Service kontinuierlich (mit GET) mit der ID des gerade eingereihten Jobs ab. Wenn der MSMQ-Client mit der Aufgabe fertig ist, sollte er das Ergebnis der Operation zurückgeben. Andernfalls wird er 202 Accepted mit dem geeigneten Ablaufdatum für den nächsten empfohlenen Abruf zurückgeben.
Meine Frage ist: Wie sollte ich die Kommunikation von MSMQ zum Webservice implementieren? Speziell, wie würde mein Webservice wissen, ob eine Nachricht vom MSMQ-Client verarbeitet wurde?
Mein erster Gedanke war, eine "job" -Tabelle in der SQL-Datenbank zu haben, die eine JobId, einen Flag zur Anzeige anzeigt ob ein Job abgeschlossen ist und ein Ergebnis der Berechnung enthält. Die MSMQ-Anwendung würde dann in diese Tabelle schreiben, wenn sie einen Job beendet hat, während der Webservice die Datenbank bei jeder Anfrage nach dem Status eines Jobs abfragen würde. Mir gefällt dieser Ansatz nicht so gut, da mein Webservice sonst keinen SQL-Server verwenden würde - die Ergebnisse des Jobs sind idempotent (aber zeitaufwendig) und ich beabsichtige nicht, die von ihm zurückgegebenen Daten auf irgendeine Weise zu speichern.
Ich frage mich, ob es einen idiomatischeren Ansatz für dieses Problem gibt, da dies das erste Mal ist, dass ich mit MSMQ oder Nachrichtenwarteschlangen im Allgemeinen umgehe.