一尘不染

如何通过我域中引发的事件在RedMQ中设置处理程序

redis

让我开始关注消息队列和Redis
MQ
(出色的框架)。

我了解您必须使用.RegisterHandler(…)确定哪个处理程序将处理消息队列中的消息/事件的类型。

因此,如果我有EventA,EventB等,我应该有一个服务来处理每个这些事件,例如:

public class DomainService : Service {

    public object Any(EventA eventA) {...}
    public object Any(EventB eventA) {...}
}

因此,这些应该只是创建的队列/ redis列表?

另外,如果我希望发生一系列事件,例如EventA类型的消息也具有一个处理程序,该处理程序发送一个电子邮件,从而提供了该处理链上较早的处理程序成功,该怎么办?


阅读 275

收藏
2020-06-20

共1个答案

一尘不染

ServiceStack在为MQ的服务,REST,HTML或SOAP服务创建的服务之间没有区别,它们是同一回事。也就是说,它们各自接受一个请求DTO,并有选择地返回一个响应DTO,并且同一服务可以处理来自任何端点或格式(例如HTML,REST,SOAP或MQ)的调用。

请参阅ServiceStack的体系结构图以了解MQ的适用范围。

局限性

您需要记住的唯一事情是:

  • 像SOAP一样,MQ只支持1动词,因此您的方法需要命名为 PostAny
  • 仅执行动作过滤器(即不执行全局或属性过滤器)
  • 你得到MqRequest和MqResponse存根到位IHttpRequestIHttpResponse。您仍然可以.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。

2020-06-20