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

JD.*_*JD. 8 redis servicestack

刚刚了解消息队列和Redis MQ,优秀的框架.

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

所以,如果我有EventA,EventB等我应该有一个处理这些事件的服务,例如:

public class DomainService : Service {

    public object Any(EventA eventA) {...}
    public object Any(EventB eventA) {...}
}
Run Code Online (Sandbox Code Playgroud)

那么这些应该只创建队列/ redis列表吗?

另外,如果我想要发生一系列事件,那么例如一个类型为EventA的消息也有一个处理程序,它发送一个电子邮件,提供早期链接的处理程序是否成功?

myt*_*thz 15

ServiceStack在为MQ,REST,HTML或SOAP服务创建的服务之间没有区别,它们是相同的.即它们每个都接受Request DTO并可选地返回Response DTO,并且相同的服务可以处理来自任何端点或格式的调用,例如HTML,REST,SOAP或MQ.

请参阅ServiceStack的架构图,了解MQ如何适应.

限制

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

  • 与SOAP一样,MQ仅支持1个动词,因此您的方法需要命名为PostAny
  • 仅执行操作过滤器(即不是全局或属性过滤器)
  • 你得到MqRequest和MqResponse存根,代替IHttpRequest,IHttpResponse.您仍然可以使用.Items通过请求管道传递数据,但任何HTTP操作(如设置cookie或HTTP标头)都是良性的

配置Redis MQ主机

MQ Host本身与ServiceStack框架的其余部分完全分离,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
Run Code Online (Sandbox Code Playgroud)

在您的RegisterHandler<T>指定中,您可以指定要监听的请求类型.

默认情况下,您只能为每条消息注册一个处理程序,而在ServiceStack中,Request与已知的Service实现相关联,在MQ的情况下,它正在寻找首先匹配的方法签名:Post(Hello)如果它不存在,它会查找后备Any(Hello).

可以自己为每条消息添加多个处理程序

如果你想调用多个处理程序,那么你只需要维护自己的处理程序List<Handler>,并在请求进入时直接执行它们.

呼叫不同的服务

如果要调用其他服务,只需将其转换为其他Request DTO,然后将其传递给ServiceController.

当任何人发送MQ请求时,例如:

mqClient.Publish(new Hello { Name = "Client" });
Run Code Online (Sandbox Code Playgroud)

使用IMessage类型的实例调用您的处理程序,其中Request DTO包含在Body属性中.此时,您可以选择放弃消息,验证消息或更改消息.

MQ请求与任何其他服务请求相同

在大多数情况下,您通常只需将消息转发到ServiceController进行处理,其实现是:

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

该实现仅从mqMsg.Body中提取Request DTO,并将该消息作为正常服务进行处理,从该点开始传递C#Request DTO,其中MqRequestContext包含MQ IHttpRequest,IHttpResponse存根.