sql >> Databasteknik >  >> NoSQL >> Redis

Hur man ställer in hanterare i RedMQ från händelser som tagits upp i min domän

ServiceStack har ingen skillnad mellan tjänster skapade för MQ:s, REST, HTML eller SOAP tjänster, de är samma sak. d.v.s. de accepterar var och en en Request DTO och returnerar eventuellt en Response DTO och samma tjänst kan hantera samtal från vilken slutpunkt eller format som helst, t.ex. HTML, REST, SOAP eller MQ.

Se ServiceStacks arkitekturdiagram för att se hur MQ passar in.

Begränsningar

Det enda du behöver tänka på är:

  • Precis som SOAP stöder MQ endast 1 verb så dina metoder måste heta Post eller Val som helst
  • Endast åtgärdsfilter körs (d.v.s. inte globala eller attributfilter)
  • Du får MqRequest- och MqResponse-stubbar i stället för IHttpRequest , IHttpResponse . Du kan fortfarande använda .Items för att skicka data genom begäran pipeline men alla HTTP-åtgärder som att ställa in cookies eller HTTP-rubriker är godartade

Konfigurera en Redis MQ Host

Själva MQ-värden är helt frikopplad från resten av ServiceStack-ramverket, som inte vet att MQ existerar förrän du skickar meddelandet till ServiceStack själv, vilket vanligtvis görs i din registrerade hanterare, t.ex.:

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

I din RegisterHandler<T> du anger vilken typ av begäran du vill att den ska lyssna på.

Som standard kan du bara registrera en enskild hanterare för varje meddelande och i ServiceStack är en begäran knuten till en känd tjänstimplementering, i fallet med MQ:s letar den efter en metodsignatur som matchar första gången:Post(Hello) och om det inte finns letar det efter reservalternativet Any(Hello) .

Kan själv lägga till flera hanterare per meddelande

Om du vill anropa flera hanterare skulle du bara underhålla din egen List<Handler> och gå bara igenom och verkställ dem alla när en begäran kommer in.

Att ringa olika tjänster

Om du vill ringa en annan tjänst, översätt bara den till en annan Request DTO och skicka den till ServiceController istället.

När en MQ-förfrågan skickas av någon, t.ex.:

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

Din hanterare anropas med en instans av typen IMessage där Request DTO finns i Body fast egendom. Då kan du välja att kassera meddelandet, validera det eller ändra det.

MQ-förfrågningar är desamma som alla andra serviceförfrågningar

I de flesta fall skulle du vanligtvis bara vidarebefordra meddelandet till ServiceController för att bearbeta, vars implementering är:

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

Implementeringen extraherar bara Request DTO från mqMsg.Body och behandlar det meddelandet som en normal tjänst som skickas en C# Request DTO från den tidpunkten, med en MqRequestContext som innehåller MQ IHttpRequest, IHttpResponse stubbarna.




  1. MongoDB:Är det möjligt att göra en skiftlägesokänslig fråga?

  2. Redis Databas TTL

  3. Model.find().toArray() påstår sig inte ha .toArray()-metoden

  4. MongoDB $in Aggregation Pipeline Operator