ServiceStack ne fait aucune distinction entre les services créés pour les services MQ, REST, HTML ou SOAP, c'est la même chose. c'est-à-dire qu'ils acceptent chacun un DTO de demande et renvoient éventuellement un DTO de réponse et que le même service peut gérer les appels à partir de n'importe quel point de terminaison ou format, par exemple HTML, REST, SOAP ou MQ.
Reportez-vous au diagramme d'architecture de ServiceStack pour voir comment MQ s'intègre.
Limites
Les seules choses que vous devez garder à l'esprit sont :
- Comme SOAP, MQ ne prend en charge qu'un seul verbe, vos méthodes doivent donc être nommées Post ou Tout
- Seuls les filtres d'action sont exécutés (c'est-à-dire pas les filtres globaux ou d'attribut)
- Vous obtenez les stubs MqRequest et MqResponse à la place de
IHttpRequest
,IHttpResponse
. Vous pouvez toujours utiliser.Items
pour transmettre des données via le pipeline de requêtes, mais toutes les actions HTTP telles que la configuration de cookies ou d'en-têtes HTTP sont bénignes
Configuration d'un hôte Redis MQ
L'hôte MQ lui-même est complètement découplé du reste du framework ServiceStack, qui ne sait pas que le MQ existe jusqu'à ce que vous transmettiez vous-même le message à ServiceStack, ce qui se fait généralement dans votre gestionnaire enregistré, par exemple :
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
Dans votre RegisterHandler<T>
vous spécifiez le type de requête que vous souhaitez qu'il écoute.
Par défaut, vous ne pouvez enregistrer qu'un seul gestionnaire pour chaque message et dans ServiceStack, une demande est liée à une implémentation de service connue, dans le cas de MQ, elle recherche une signature de méthode correspondant en premier :Post(Hello)
et si cela n'existe pas, il recherche la solution de secours Any(Hello)
.
Peut ajouter vous-même plusieurs gestionnaires par message
Si vous souhaitez invoquer plusieurs gestionnaires, vous devez simplement maintenir votre propre List<Handler>
et il suffit de les parcourir et de les exécuter toutes lorsqu'une demande arrive.
Appeler différents services
Si vous souhaitez appeler un autre service, traduisez-le simplement en un DTO de demande différent et transmettez-le plutôt au ServiceController.
Lorsqu'une demande MQ est envoyée par n'importe qui, par exemple :
mqClient.Publish(new Hello { Name = "Client" });
Votre gestionnaire est appelé avec une instance de type IMessage où le Request DTO est contenu dans le Body biens. À ce stade, vous pouvez choisir de supprimer le message, de le valider ou de le modifier.
Les demandes MQ sont les mêmes que toutes les autres demandes de service
Dans la plupart des cas, vous feriez simplement suivre le message au ServiceController pour le traiter, dont l'implémentation est :
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
L'implémentation extrait simplement le Request DTO du mqMsg.Body et traite ce message comme un service normal recevant un DTO de requête C# à partir de ce moment, avec un MqRequestContext qui contient les stubs MQ IHttpRequest, IHttpResponse.