sql >> Databáze >  >> NoSQL >> Redis

Jak nastavit handlery v RedMQ z událostí vyvolaných v mé doméně

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.




  1. 7 způsobů, jak počítat dokumenty v MongoDB

  2. Je rámec Mongodb Aggregation rychlejší než map/reduce?

  3. Omezte délku seznamu v redis

  4. SocketException:Adresa se již používá MONGODB