当前位置: 首页 > 面试题库 >

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

章飞章
2023-03-14
问题内容

让我开始关注消息队列和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的适用范围。

局限性

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

  • 像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。



 类似资料:
  • 本文向大家介绍深入理解在JS中通过四种设置事件处理程序的方法,包括了深入理解在JS中通过四种设置事件处理程序的方法的使用技巧和注意事项,需要的朋友参考一下 所有的JavaScript事件处理程序的作用域是在其定义时的作用域而非调用时的作用域中执行,并且它们能存取那个作用域中的任何一个本地变量。但是HTML标签属性注册处理程序就是一个例外。看下面四种方式: 第一种方式(HTML标签属性): 上面的代

  • 我创建了一个控制器,根据加密的GET参数手动设置安全令牌。我使用它来创建一个远程登录URL,当用户遵循此链接时,该URL将执行登录。 现在我想添加区域设置。当提供了朗参数时,它应该设置区域设置。我添加了这个到我的控制器: 正在根据开发栏将_locale变量设置到设置中。但是,未加载语言文件,它将返回默认语言。 我读过关于创建监听器来实现这一点的文章,但是在我看来,当你想在网址中提供语言时,这是有用

  • 问题内容: 我正在测试一个Web应用程序。在主页的导航菜单中,单击节点后, 将调用javascript 函数。我查找了此功能,该页面将在重定向到目标 页面之前设置。 那么,如何为每个请求在JMeter中设置cookie? 问题答案: 在BeanShell预处理器中,放入: 请注意,使用JSR223 PreProcessor + Groovy + Caching会更好地提高 性能

  • 如何使事件在ReactJS中工作?它应该在按下回车键(keyCode=13)时发出警报。

  • 我试图在一个简单的JavaFX应用程序中向一个可编辑的组合框中添加一个关键事件处理程序。由于场景构建器不提供对组合框中的TextField的访问,我不得不在代码中添加事件处理程序。 下面是我添加处理程序的尝试。 设置事件处理程序的更合适的方法是什么? 编辑:添加完整的源代码

  • 我想在React中使用TypeScript创建一个自定义组件,它本质上是一个组合框,具有自动完成/搜索功能,连接到自己的远程存储。我想做的是发送一个“onSelect”事件,这样我就可以在我的应用程序中使用该组件的任何地方接收选定的项目。 使用远程商店进行自动完成/搜索很容易,但React组件的工作让我感到困惑。我仍然在学习这两种方法,所以我可能在爬之前就尝试着走路,但我不想一开始就制造混乱,因为