sql >> Database >  >> NoSQL >> Redis

Hoe handlers in RedMQ in te stellen van gebeurtenissen die in mijn domein zijn gegenereerd

ServiceStack maakt geen onderscheid tussen services die zijn gemaakt voor MQ's, REST, HTML of SOAP-services, ze zijn hetzelfde. d.w.z. ze accepteren elk een Request DTO en retourneren optioneel een Response DTO en dezelfde service kan oproepen afhandelen vanaf elk eindpunt of formaat, bijvoorbeeld HTML, REST, SOAP of MQ.

Raadpleeg het Architectuurdiagram van ServiceStack om te zien hoe MQ daarin past.

Beperkingen

De enige dingen die u in gedachten moet houden zijn:

  • Net als SOAP ondersteunen MQ's maar 1 werkwoord, dus je methoden moeten de naam Berichten krijgen of Elke
  • Alleen actiefilters worden uitgevoerd (d.w.z. geen algemene of kenmerkfilters)
  • Je krijgt MqRequest- en MqResponse-stubs in plaats van IHttpRequest , IHttpResponse . Je kunt nog steeds .Items . gebruiken om gegevens door de verzoekpijplijn te sturen, maar alle HTTP-acties zoals het instellen van cookies of HTTP-headers zijn goedaardig

Een Redis MQ-host configureren

De MQ Host zelf is volledig losgekoppeld van de rest van het ServiceStack-framework, die niet weet dat de MQ bestaat totdat u het bericht zelf doorgeeft aan ServiceStack, wat gewoonlijk wordt gedaan binnen uw geregistreerde handler, bijvoorbeeld:

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 uw RegisterHandler<T> u specificeert het type verzoek waarnaar u wilt luisteren.

Standaard kunt u voor elk bericht slechts één handler registreren en in ServiceStack is een Request gekoppeld aan een bekende Service-implementatie, in het geval van MQ's zoekt het naar een methodehandtekening die eerst overeenkomt:Post(Hello) en als dat niet bestaat, zoekt het naar de fallback Any(Hello) .

Kan zelf meerdere handlers per bericht toevoegen

Als u meerdere handlers wilt aanroepen, houdt u gewoon uw eigen List<Handler> bij en ga gewoon door en voer ze allemaal uit als er een verzoek binnenkomt.

Andere diensten bellen

Als u een andere service wilt bellen, vertaal deze dan gewoon naar een andere Request DTO en geef die in plaats daarvan door aan de ServiceController.

Wanneer een MQ-verzoek door iemand wordt verzonden, bijvoorbeeld:

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

Uw handler wordt aangeroepen met een instantie van het type IMessage waarbij de Request DTO is opgenomen in de Body eigendom. Op dat moment kunt u ervoor kiezen om het bericht te verwijderen, te valideren of te wijzigen.

MQ-verzoeken zijn hetzelfde als alle andere serviceverzoeken

In de meeste gevallen stuurt u het bericht gewoon door naar de ServiceController om het te verwerken, waarvan de implementatie is:

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

De implementatie extraheert gewoon de Request DTO uit de mqMsg.Body en verwerkt dat bericht als een normale service die vanaf dat moment een C# Request DTO krijgt doorgegeven, met een MqRequestContext die de MQ IHttpRequest, IHttpResponse-stubs bevat.




  1. Een Foreign Key-relatie creëren in Mongoose

  2. DeprecationWarning:collection.findAndModify is verouderd. Gebruik in plaats daarvan findOneAndUpdate, findOneAndReplace of findOneAndDelete?

  3. Hoe de vervaldatum in te stellen op meerdere sleutels in Redis

  4. Hoe moet ik dit schema in MongoDB implementeren?