sql >> Base de Datos >  >> NoSQL >> Redis

Cómo configurar handlers en RedMQ a partir de eventos generados en mi dominio

ServiceStack no distingue entre servicios creados para servicios MQ, REST, HTML o SOAP, son lo mismo. es decir, cada uno acepta un DTO de solicitud y, opcionalmente, devuelve un DTO de respuesta y el mismo servicio puede manejar llamadas desde cualquier punto final o formato, por ejemplo, HTML, REST, SOAP o MQ.

Consulte el diagrama de Arquitectura de ServiceStack para ver cómo encaja MQ.

Limitaciones

Lo único que debe tener en cuenta es:

  • Al igual que SOAP, MQ solo admite 1 verbo, por lo que sus métodos deben llamarse Publicar o Cualquiera
  • Solo se ejecutan los filtros de acción (es decir, no los filtros globales o de atributos)
  • Obtienes stubs MqRequest y MqResponse en lugar de IHttpRequest , IHttpResponse . Todavía puedes usar .Items para pasar datos a través de la canalización de solicitudes, pero cualquier acción HTTP, como configurar cookies o encabezados HTTP, es benigna

Configuración de un host Redis MQ

El MQ Host en sí está completamente desacoplado del resto del marco de ServiceStack, que no sabe que MQ existe hasta que usted mismo pasa el mensaje a ServiceStack, lo que comúnmente se hace dentro de su controlador registrado, por ejemplo:

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

En su RegisterHandler<T> usted especifica el tipo de solicitud que desea que escuche.

De manera predeterminada, solo puede registrar un solo controlador para cada mensaje y en ServiceStack, una solicitud está vinculada a una implementación de servicio conocida, en el caso de MQ, primero busca una firma de método que coincida:Post(Hello) y si eso no existe, busca el respaldo Any(Hello) .

Puede agregar varios controladores por mensaje usted mismo

Si desea invocar a varios controladores, debe mantener su propio List<Handler> y simplemente revíselos y ejecútelos todos cuando llegue una solicitud.

Llamar a diferentes servicios

Si desea llamar a un servicio diferente, simplemente tradúzcalo a un DTO de solicitud diferente y páselo al ServiceController en su lugar.

Cuando alguien envía una Solicitud MQ, por ejemplo:

mqClient.Publish(new Hello { Name = "Client" });

Su controlador se invoca con una instancia de tipo IMessage donde la Solicitud DTO está contenida en el Cuerpo propiedad. En ese momento, puede optar por descartar el mensaje, validarlo o modificarlo.

Las solicitudes de MQ son las mismas que cualquier otra solicitud de servicio

En la mayoría de los casos, normalmente solo reenviaría el mensaje al ServiceController para que lo procese, cuya implementación es:

public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
    return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}

La implementación simplemente extrae la solicitud DTO del mqMsg.Body y procesa ese mensaje como un servicio normal al que se le pasa un DTO de solicitud de C# a partir de ese momento, con un MqRequestContext que contiene los stubs MQ IHttpRequest, IHttpResponse.