Redis
 sql >> Datenbank >  >> NoSQL >> Redis

So richten Sie Handler in RedMQ anhand von Ereignissen ein, die in meiner Domäne ausgelöst wurden

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

Sehen Sie sich das Architekturdiagramm von ServiceStack an, um zu sehen, wie sich MQ einfügt.

Einschränkungen

Die einzigen Dinge, die Sie beachten müssen, sind:

  • Wie SOAP unterstützen MQs nur 1 Verb, daher müssen Ihre Methoden Post heißen oder Alle
  • Nur Aktionsfilter werden ausgeführt (also keine globalen oder Attributfilter)
  • Sie erhalten MqRequest- und MqResponse-Stubs anstelle von IHttpRequest , IHttpResponse . Sie können weiterhin .Items verwenden um Daten durch die Anforderungspipeline zu leiten, aber alle HTTP-Aktionen wie das Setzen von Cookies oder HTTP-Headern sind harmlos

Konfigurieren eines Redis MQ-Hosts

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

var redisFactory = new PooledRedisClientManager("localhost:6379");
var mqHost = new RedisMqServer(redisFactory, retryCount:2);

mqHost.RegisterHandler<Hello>(m => {
    return this.ServiceController.ExecuteMessage(m);
});

//shorter version:
//mqHost.RegisterHandler<Hello>(ServiceController.ExecuteMessage);


mqHost.Start(); //Starts listening for messages

In Ihrem RegisterHandler<T> Sie geben die Art der Anforderung an, auf die es lauschen 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 MQ wird zuerst nach einer passenden Methodensignatur gesucht:Post(Hello) und wenn das nicht existiert, sucht es nach dem Fallback Any(Hello) .

Sie können selbst mehrere Handler pro Nachricht hinzufügen

Wenn Sie mehrere Handler aufrufen möchten, pflegen Sie einfach Ihre eigene List<Handler> und sie einfach alle durchgehen und ausführen, wenn eine Anfrage eintrifft.

Verschiedene Dienste anrufen

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

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

mqClient.Publish(new Hello { Name = "Client" });

Ihr Handler wird mit einer Instanz vom Typ IMessage aufgerufen, wobei das Anforderungs-DTO im Body enthalten ist Eigentum. An diesem Punkt können Sie die Nachricht verwerfen, validieren oder ändern.

MQ-Anfragen sind die gleichen wie alle anderen Dienstanfragen

In den meisten Fällen würden Sie die Nachricht normalerweise einfach an den ServiceController zur Verarbeitung weiterleiten, dessen Implementierung wie folgt lautet:

public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
    return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}

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