ServiceStack skelner ikke mellem tjenester, der er oprettet til MQ's, REST, HTML eller SOAP-tjenester, de er de samme ting. dvs. de accepterer hver en Request DTO og returnerer eventuelt en Response DTO, og den samme service kan håndtere opkald fra ethvert endpoint eller format, f.eks. HTML, REST, SOAP eller MQ.
Se ServiceStacks arkitekturdiagram for at se, hvordan MQ passer ind.
Begrænsninger
De eneste ting du skal huske på er:
- Ligesom SOAP understøtter MQ'er kun 1 verbum, så dine metoder skal hedde Post eller Enhver
- Kun handlingsfiltre udføres (dvs. ikke globale eller attributfiltre)
- Du får MqRequest og MqResponse stubs i stedet for
IHttpRequest
,IHttpResponse
. Du kan stadig bruge.Items
at sende data gennem anmodningspipelinen, men alle HTTP-handlinger såsom indstilling af cookies eller HTTP-headere er godartede
Konfiguration af en Redis MQ Host
Selve MQ-værten er fuldstændig afkoblet fra resten af ServiceStack-rammeværket, som ikke ved, at MQ'en eksisterer, før du selv sender beskeden til ServiceStack, hvilket almindeligvis gøres inde i din registrerede handler, f.eks.:
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 angiver den type anmodning, du ønsker, at den skal lytte til.
Som standard kan du kun registrere en enkelt behandler for hver besked, og i ServiceStack er en anmodning knyttet til en kendt serviceimplementering, i tilfælde af MQ'er leder den efter en metodesignatur, der matcher første gang:Post(Hello)
og hvis det ikke eksisterer, leder den efter reserven Any(Hello)
.
Kan selv tilføje flere behandlere pr. besked
Hvis du vil påberåbe flere behandlere, skal du bare vedligeholde din egen List<Handler>
og bare gå igennem og udføre dem alle, når der kommer en anmodning ind.
Opkald til forskellige tjenester
Hvis du vil ringe til en anden tjeneste, skal du bare oversætte den til en anden Request DTO og videregive den til ServiceControlleren i stedet.
Når en MQ-anmodning sendes af nogen, f.eks.:
mqClient.Publish(new Hello { Name = "Client" });
Din handler påkaldes med en forekomst af typen IMessage, hvor Request DTO er indeholdt i Body ejendom. På det tidspunkt kan du vælge at kassere beskeden, validere den eller ændre den.
MQ-anmodninger er de samme som alle andre serviceanmodninger
I de fleste tilfælde vil du typisk bare videresende beskeden til ServiceController for at behandle, hvis implementering er:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Implementeringen udtrækker bare Request DTO fra mqMsg.Body og behandler denne besked som en normal tjeneste, der sendes en C# Request DTO fra det tidspunkt med en MqRequestContext, der indeholder MQ IHttpRequest, IHttpResponse stubs.