ServiceStack nerozlišuje mezi službami vytvořenými pro MQ, REST, HTML nebo SOAP služby, jsou to stejné. tj. každý z nich přijme požadavek DTO a volitelně vrátí Response DTO a stejná služba může zpracovávat volání z jakéhokoli koncového bodu nebo formátu, např. HTML, REST, SOAP nebo MQ.
Podívejte se na diagram architektury ServiceStack, abyste viděli, jak MQ zapadá.
Omezení
Jediné, co musíte mít na paměti, jsou:
- Stejně jako SOAP podporuje MQ pouze 1 sloveso, takže vaše metody musí být pojmenovány Post nebo Jakýkoli
- Provádějí se pouze filtry akcí (tj. nikoli globální filtry ani filtry atributů)
- Namísto
IHttpRequest
získáte útržky MqRequest a MqResponse ,IHttpResponse
. Stále můžete používat.Items
předat data kanálem požadavků, ale jakékoli akce HTTP, jako je nastavení souborů cookie nebo záhlaví HTTP, jsou neškodné
Konfigurace hostitele Redis MQ
Samotný hostitel MQ je zcela oddělen od zbytku rámce ServiceStack, který neví, že MQ existuje, dokud sami neodešlete zprávu do ServiceStack, což se běžně provádí uvnitř vašeho registrovaného obslužného programu, např.:
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
Ve vašem RegisterHandler<T>
určíte typ požadavku, kterému má naslouchat.
Ve výchozím nastavení můžete pro každou zprávu zaregistrovat pouze jeden obslužný program a v ServiceStack je požadavek svázán se známou implementací služby, v případě MQ se hledá první odpovídající podpis metody:Post(Hello)
a pokud neexistuje, hledá záložní Any(Hello)
.
Můžete sami přidat více obslužných programů na zprávu
Pokud chcete vyvolat více obslužných rutin, měli byste pouze udržovat svůj vlastní List<Handler>
a stačí je všechny projít a provést, když přijde požadavek.
Volání různých služeb
Pokud chcete zavolat jinou službu, jednoduše ji přeložte na jinou žádost DTO a předejte ji ServiceControlleru.
Když někdo odešle požadavek MQ, např.:
mqClient.Publish(new Hello { Name = "Client" });
Váš obslužný program je vyvolán s instancí typu IMessage, kde je požadavek DTO obsažen v těle vlastnictví. V tomto okamžiku se můžete rozhodnout zprávu zahodit, ověřit nebo změnit.
Požadavky MQ jsou stejné jako jakékoli jiné požadavky na službu
Ve většině případů byste obvykle zprávu pouze přeposlali do ServiceController ke zpracování, jehož implementace je:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Implementace pouze extrahuje požadavek DTO z mqMsg.Body a zpracovává tuto zprávu jako normální službu, která je od tohoto okamžiku předávána C# Request DTO s MqRequestContext, který obsahuje útržky MQ IHttpRequest, IHttpResponse.