让我的头脑message queues and Redis MQ,优秀的框架。
我知道您必须使用.RegisterHandler(...)来确定哪个处理程序将处理消息队列中的消息/事件类型。
因此,如果我有EventA,EventB等,我应该有一个处理这些事件的服务,例如:
public class DomainService : Service {
public object Any(EventA eventA) {...}
public object Any(EventB eventA) {...}
}
那么这些应该只创建队列/ redis列表吗?
此外,如果我想要发生一系列事件,那么例如一个类型为EventA的消息也有一个处理程序,它发送一个电子邮件提供链上的处理程序成功了吗?
答案 0 :(得分:15)
ServiceStack在为MQ,REST,HTML或SOAP服务创建的服务之间没有区别,它们是相同的。即它们各自接受请求DTO并且可选地返回响应DTO,并且相同的服务可以处理来自任何端点或格式的调用,例如HTML,REST,SOAP或MQ。
请参阅ServiceStack's Architecture图表,了解MQ如何适应。
您需要记住的唯一事项是:
IHttpRequest
,IHttpResponse
。您仍然可以使用.Items
通过请求管道传递数据,但任何HTTP操作(如设置cookie或HTTP标头)都是良性的MQ Host本身与ServiceStack框架的其余部分完全分离,后者在您自己将消息传递到ServiceStack之前不知道MQ是否存在,这通常在您注册的处理程序中完成,例如:
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中,Request与已知的Service实现相关联,在MQ的情况下,它正在寻找首先匹配的方法签名:Post(Hello)
如果是它不存在它寻找后备Any(Hello)
。
如果您想调用多个处理程序,那么您只需维护自己的List<Handler>
,并在请求进入时直接执行它们。
如果要调用其他服务,只需将其转换为其他Request DTO,然后将其传递给ServiceController。
当任何人发送MQ请求时,例如:
mqClient.Publish(new Hello { Name = "Client" });
使用类型为IMessage的实例调用您的处理程序,其中Request DTO包含在 Body 属性中。此时,您可以选择放弃消息,验证消息或更改消息。
在大多数情况下,您通常只会将消息转发到ServiceController to process,其实现是:
public object ExecuteMessage<T>(IMessage<T> mqMsg)
{
return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg));
}
该实现只是从 mqMsg.Body 中提取请求DTO,并将该消息作为正常服务从该点传递到C#请求DTO,并使用包含MQ IHttpRequest的MqRequestContext, IHttpResponse存根。