Einrichten von Handlern in RedMQ aus Ereignissen, die in meiner Domäne ausgelöst wurden

8

Ich komme nur um Nachrichtenwarteschlangen und Redis MQ , exzellentes Framework.

>

Ich verstehe, dass Sie .RegisterHandler (...) verwenden müssen, um zu bestimmen, welcher Handler den Typ der Nachricht / des Ereignisses in der Nachrichtenwarteschlange verarbeiten wird.

Wenn ich also EventA, EventB usw. habe, sollte ich einen Service haben, der jedes dieser Events behandelt, wie:

%Vor%

Also sollte das nur queue / redis list erstellt werden?

Was auch, wenn ich möchte, dass eine Kette von Ereignissen passiert, also zum Beispiel eine Nachricht vom Typ EventA einen Handler hat, der eine Email sendet, die Handler früher in der Kette erfolgreich ist?

    
JD. 12.12.2012, 12:37
quelle

1 Antwort

15

ServiceStack unterscheidet nicht zwischen Diensten, die für MQ-, REST-, HTML- oder SOAP-Dienste erstellt wurden, sie sind dasselbe. d. h. sie akzeptieren jeweils ein Anforderungs-DTO und geben optional ein Antwort-DTO zurück, und derselbe Dienst kann Anrufe von jedem Endpunkt oder Format verarbeiten, z. B. HTML, REST, SOAP oder MQ.

Sehen Sie sich das Diagramm ServiceStacks Architektur an, um zu sehen, wie sich MQ anpasst.

Einschränkungen

Die einzigen Dinge, die Sie beachten sollten, sind:

  • Wie SOAP unterstützt MQ nur 1 Verb, sodass Ihre Methoden Post oder Any heißen müssen
  • Nur Aktionsfilter werden ausgeführt (d. h. keine globalen oder Attributfilter)
  • Sie erhalten MqRequest- und MqResponse-Stubs anstelle von IHttpRequest , IHttpResponse . Sie können .Items weiterhin verwenden, um Daten über die Anforderungs-Pipeline weiterzuleiten, aber HTTP-Aktionen wie das Setzen von Cookies oder HTTP-Header sind gutartig

Konfigurieren eines Redis MQ-Hosts

Der MQ-Host selbst ist vollständig vom Rest des ServiceStack-Frameworks entkoppelt. Er weiß nicht, dass der MQ existiert, bis Sie die Nachricht selbst an ServiceStack übergeben, was üblicherweise in Ihrem registrierten Handler geschieht, z. B .:

%Vor%

In Ihrem RegisterHandler<T> geben Sie den Typ der Anfrage an, auf die sie achten soll.

Standardmäßig können Sie nur einen einzigen Handler für jede Nachricht registrieren und in ServiceStack ist eine Anfrage an eine bekannte Service-Implementierung gebunden, im Fall von MQs sucht sie nach einer Methodensignatur, die zuerst übereinstimmt: Post(Hello) und wenn das nicht funktioniert t existiert es sucht nach dem Fallback Any(Hello) .

Kann mehrere Handler pro Nachricht selbst hinzufügen

Wenn Sie mehrere Handler aufrufen möchten, behalten Sie einfach Ihre eigene List<Handler> und durchlaufen sie einfach und führen sie alle aus, wenn eine Anfrage eingeht.

Aufruf von verschiedenen Diensten

Wenn Sie einen anderen Dienst aufrufen möchten, übersetzen Sie ihn einfach in einen anderen Anforderungs-DTO und übergeben Sie ihn stattdessen an den ServiceController.

Wenn eine MQ-Anfrage von jemandem gesendet wird, z. B .:

%Vor%

Ihr Handler wird mit einer Instanz des Typs IMessage Der Anfrage-DTO ist in der Eigenschaft Body enthalten. An diesem Punkt können Sie wählen, die Nachricht zu verwerfen, zu validieren oder zu ändern.

MQ Requests sind die gleichen wie alle anderen Service Requests

In den meisten Fällen leiten Sie die Nachricht normalerweise nur an die ServiceController zu verarbeiten , dessen Implementierung ist:

%Vor%

Die Implementierung extrahiert einfach das Anforderungs-DTO aus der mqMsg.Body und verarbeitet diese Nachricht als normalen Dienst, der von diesem Punkt an eine C # -Anforderungs-DTO mit einem MqRequestContext übergeben wird, der die MQ IHttpRequest enthält. IHttpResponse Stubs.

    
mythz 13.12.2012, 06:13
quelle

Tags und Links