让我开始关注消息队列和Redis MQ(出色的框架)。
我了解您必须使用.RegisterHandler(…)确定哪个处理程序将处理消息队列中的消息/事件的类型。
因此,如果我有EventA,EventB等,我应该有一个服务来处理每个这些事件,例如:
public class DomainService : Service { public object Any(EventA eventA) {...} public object Any(EventB eventA) {...} }
因此,这些应该只是创建的队列/ redis列表?
另外,如果我希望发生一系列事件,例如EventA类型的消息也具有一个处理程序,该处理程序发送一个电子邮件,从而提供了该处理链上较早的处理程序成功,该怎么办?
ServiceStack在为MQ的服务,REST,HTML或SOAP服务创建的服务之间没有区别,它们是同一回事。也就是说,它们各自接受一个请求DTO,并有选择地返回一个响应DTO,并且同一服务可以处理来自任何端点或格式(例如HTML,REST,SOAP或MQ)的调用。
请参阅ServiceStack的体系结构图以了解MQ的适用范围。
您需要记住的唯一事情是:
IHttpRequest
IHttpResponse
.Items
MQ主机本身与其余的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>,指定您希望其侦听的请求的类型。
RegisterHandler<T>
默认情况下,您只能为每个消息注册一个处理程序,并且在ServiceStack中,一个Request绑定到一个已知的Service实现,对于MQ而言,它正在寻找首先匹配的方法签名:Post(Hello)如果不存在,则在其中查找后备Any(Hello)。
Post(Hello)
Any(Hello)
如果要调用多个处理程序,则只需维护自己的处理程序,然后List<Handler>在请求进入时执行所有这些处理程序即可。
List<Handler>
如果要调用其他服务,只需将其转换为其他Request DTO,然后将其传递给ServiceController。
任何人发送MQ请求时,例如:
mqClient.Publish(new Hello { Name = "Client" });
使用IMessage类型的实例调用您的处理程序,其中,请求DTO包含在 Body 属性中。此时,您可以选择丢弃消息,对其进行验证或对其进行更改。
在大多数情况下,通常只需将消息转发到ServiceController即可进行处理,其实现是:
public object ExecuteMessage<T>(IMessage<T> mqMsg) { return Execute(mqMsg.Body, new MqRequestContext(this.Resolver, mqMsg)); }
该实现仅从 mqMsg.Body中 提取出请求DTO,然后将该消息作为从该点开始通过C#请求DTO传递的普通服务进行处理,并带有一个包含MQ IHttpRequest和IHttpResponse存根的MqRequestContext。