如何从我的域名引发的事件建立处理程序RedMQ(How to set up handlers in

2019-08-03 23:48发布

刚开始我的头周围的消息队列和Redis的MQ ,优秀的框架。

据我所知,你必须使用.RegisterHandler(...),以确定哪些处理程序将处理消息/事件是在消息队列的类型。

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

public class DomainService : Service {

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

因此,这些应该是唯一的队列/ Redis的列表中创建?

另外,如果我想一连串的事件发生,因此,例如型EventA的消息还具有发送电子邮件提供处理器早些时候链被成功处理程序?

Answer 1:

ServiceStack对MQ的,REST,HTML或SOAP服务创建的服务没有区别,他们是同样的事情。 即它们每接受一个请求DTO和可选返回响应DTO和相同的服务可以处理来自任何终端和格式,如HTML,REST,SOAP或MQ调用。

请参阅ServiceStack的架构图看MQ如何适用。

限制

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

  • 像SOAP,MQ的唯一支持1动词让你的方法需要被命名为张贴任何
  • 只有行动,过滤器是执行(即不全局或属性过滤器)
  • 你得到MqRequest和MqResponse存根代替IHttpRequestIHttpResponse 。 您仍然可以使用.Items通过请求管道来传递数据,但像设置cookie或HTTP头的任何HTTP动作是良性

配置Redis的MQ主机

在MQ主机本身完全从ServiceStack框架,谁不知道MQ其余脱钩一直存在,直到你将消息传递到ServiceStack自己,这就是通常你注册的处理程序,如内部完成:

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请求被绑定到一个已知的服务实现,在MQ的它在寻找一个方法签名第一匹配的情况下,单一的处理程序: Post(Hello) ,如果不存在它看起来回退Any(Hello)

可以增加每个消息自行多个处理程序

如果要调用多个处理程序,那么你只想维护自己的List<Handler> ,只是去通过,并在收到请求时执行它们。

调用不同的服务

如果你想调用不同的服务,只需将其转换成不同的请求DTO并传递到ServiceController的替代。

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

mqClient.Publish(new Hello { Name = "Client" });

你的处理函数与类型的实例消息对象 ,其中请求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,具有MqRequestContext包含MQ IHttpRequest,IHttpResponse存根。



文章来源: How to set up handlers in RedMQ from events raised in my domain