ServiceStack在为MQ的服务,REST,HTML或SOAP服务创建的服务之间没有区别,它们是同一回事。也就是说,它们各自接受一个请求DTO,并有选择地返回一个响应DTO,并且同一服务可以处理来自任何端点或格式(例如HTML,REST,SOAP或MQ)的调用。
请参阅ServiceStack的体系结构图以了解MQ的适用范围。
局限性
您需要记住的唯一事情是:
- 像SOAP一样,MQ只支持1动词,因此您的方法需要命名为 Post 或 Any
- 仅执行动作过滤器(即不执行全局或属性过滤器)
- 你得到MqRequest和MqResponse存根到位
IHttpRequest
,IHttpResponse
。您仍然可以.Items
通过请求管道传递数据,但是任何HTTP操作(如设置cookie或HTTP标头)都是良性的
配置Redis MQ主机
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>,指定您希望其侦听的请求的类型。
默认情况下,您只能为每个消息注册一个处理程序,并且在ServiceStack中,一个Request绑定到一个已知的Service实现,对于MQ而言,它正在寻找首先匹配的方法签名:
Post(Hello)如果不存在,则在其中查找后备
Any(Hello)。
可以自己为每个消息添加多个处理程序
如果要调用多个处理程序,则只需维护自己的处理程序,然后
List<Handler>在请求进入时执行所有这些处理程序即可。
拨打不同的服务
如果要调用其他服务,只需将其转换为其他Request DTO,然后将其传递给ServiceController。
任何人发送MQ请求时,例如:
mqClient.Publish(new Hello { Name = "Client" });使用IMessage类型的实例调用您的处理程序,其中,请求DTO包含在
Body 属性中。此时,您可以选择丢弃消息,对其进行验证或对其进行更改。
MQ请求与任何其他服务请求相同
在大多数情况下,通常只需将消息转发到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。



