ServiceStack nie rozróżnia usług stworzonych dla usług MQ, REST, HTML lub SOAP, to to samo. tzn. każdy z nich akceptuje Request DTO i opcjonalnie zwraca Response DTO, a ta sama usługa może obsługiwać wywołania z dowolnego punktu końcowego lub formatu, np. HTML, REST, SOAP lub MQ.
Zapoznaj się z diagramem architektury ServiceStack, aby zobaczyć, jak pasuje MQ.
Ograniczenia
Jedyne rzeczy, o których musisz pamiętać, to:
- Podobnie jak SOAP, MQ obsługuje tylko 1 czasownik, więc metody muszą mieć nazwę Opublikuj lub Dowolny
- Wykonywane są tylko filtry akcji (tzn. nie filtry globalne ani filtry atrybutów)
- Otrzymujesz kody pośredniczące MqRequest i MqResponse zamiast
IHttpRequest
,IHttpResponse
. Nadal możesz używać.Items
do przekazywania danych przez potok żądania, ale wszelkie działania HTTP, takie jak ustawianie plików cookie lub nagłówków HTTP, są łagodne
Konfigurowanie hosta Redis MQ
Sam host MQ jest całkowicie oddzielony od reszty frameworka ServiceStack, który nie wie, że MQ istnieje, dopóki sam nie przekażesz wiadomości do ServiceStack, co zwykle odbywa się w zarejestrowanej obsłudze, np.:
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
W swoim RegisterHandler<T>
określasz typ żądania, którego ma nasłuchiwać.
Domyślnie możesz zarejestrować tylko jedną procedurę obsługi dla każdej wiadomości, a w ServiceStack żądanie jest powiązane ze znaną implementacją usługi, w przypadku MQ szuka pierwszej sygnatury metody:Post(Hello)
a jeśli to nie istnieje, szuka awaryjnego Any(Hello)
.
Możesz samodzielnie dodać wiele programów obsługi do wiadomości
Jeśli chcesz wywołać wiele programów obsługi, po prostu utrzymuj własną List<Handler>
i po prostu przejrzyj je i wykonaj je wszystkie, gdy nadejdzie żądanie.
Wywoływanie różnych usług
Jeśli chcesz wywołać inną usługę, po prostu przetłumacz ją na inne żądanie DTO i przekaż zamiast tego do ServiceController.
Gdy żądanie MQ zostanie wysłane przez kogokolwiek, np.:
mqClient.Publish(new Hello { Name = "Client" });
Twój program obsługi jest wywoływany z wystąpieniem typu IMessage, w którym Request DTO jest zawarte w Body własność. W tym momencie możesz odrzucić wiadomość, zatwierdzić ją lub zmienić.
Żądania MQ są takie same jak inne żądania usług
W większości przypadków zazwyczaj przesyłasz wiadomość do kontrolera ServiceController w celu przetworzenia, którego implementacja to:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
Implementacja po prostu wyodrębnia żądanie DTO z mqMsg.Body i przetwarza tę wiadomość jako normalną usługę, do której od tego momentu przekazywane jest żądanie DTO C#, z MqRequestContext, który zawiera kody pośredniczące MQ IHttpRequest, IHttpResponse.