ServiceStack няма разлика между услугите, създадени за MQ, REST, HTML или SOAP услуги, те са едно и също нещо. т.е. всеки от тях приема DTO на заявка и по избор връща DTO за отговор и същата услуга може да обработва повиквания от всяка крайна точка или формат, например HTML, REST, SOAP или MQ.
Вижте архитектурната диаграма на ServiceStack, за да видите как MQ се вписва.
Ограничения
Единствените неща, които трябва да имате предвид са:
- Подобно на SOAP, MQ поддържа само 1 глагол, така че вашите методи трябва да бъдат наречени Post или Всякакво
- Изпълняват се само филтри за действие (т.е. не глобални или атрибутни филтри)
- Получавате MqRequest и MqResponse мъничета вместо
IHttpRequest
,IHttpResponse
. Все още можете да използвате.Items
за предаване на данни през тръбопровода за заявки, но всички HTTP действия като задаване на бисквитки или HTTP заглавки са доброкачествени
Конфигуриране на Redis MQ хост
Самият MQ Host е напълно отделен от останалата част от рамката на ServiceStack, който не знае, че MQ съществува, докато не предадете съобщението в ServiceStack сами, което обикновено се прави във вашия регистриран манипулатор, напр.:
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
Във вашия RegisterHandler<T>
Вие посочвате вида на Заявката, която искате да слуша.
По подразбиране можете да регистрирате само един манипулатор за всяко съобщение и в ServiceStack заявката е свързана с известна реализация на услугата, в случай на MQ, тя търси първо съвпадение на подпис на метод:Post(Hello)
и ако това не съществува, търси резервния Any(Hello)
.
Можете сами да добавяте множество манипулатори на съобщение
Ако искате да извикате множество манипулатори, тогава просто трябва да поддържате свой собствен List<Handler>
и просто преминете и ги изпълнете всички, когато постъпи заявка.
Извикване на различни услуги
Ако искате да се обадите на друга услуга, просто я преведете в различен DTO на заявка и вместо това го предайте на ServiceController.
Когато MQ заявка е изпратена от някой, напр.:
mqClient.Publish(new Hello { Name = "Client" });
Вашият манипулатор се извиква с екземпляр от тип IMessage, където DTO на заявката се съдържа в Body Имот. В този момент можете да изберете да отхвърлите съобщението, да го потвърдите или да го промените.
Заявките за MQ са същите като всички други заявки за услуги
В повечето случаи обикновено просто препращате съобщението към ServiceController за обработка, чиято реализация е:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Реализацията просто извлича DTO на заявка от mqMsg.Body и обработва това съобщение като нормална услуга, на която се предава C# Request DTO от този момент нататък, с MqRequestContext, който съдържа MQ IHttpRequest, IHttpResponse мъничета.