我试图结合Azure Service Bus了解MassTransit配置。
在配置时,有2种方法具有重载:SubscriptionEndpoint<T>
和RecieveEndpoint
。我如何理解与MT和ASB进行消息传递的方式。
有两种消息:事件和命令。事件通过Publish<T>
方法发布并传递给主题。它们可以被许多不同的应用程序使用。命令通过Send<T>
方法发送并传递到队列。来自队列的消息仅使用一次(例如并发阅读器)。
因此,我认为SubscribtionEndpoint代表事件的配置,因此它具有<T>
用于通过类型约定进行路由,而RecieveEndpoint用于连接命令发送者和命令处理程序。
但是我的测试应用程序说,无论我使用SubscribtionEndpoint还是RecieveEndpoint,无论天气如何,我仍然可以接收事件。
让我们考虑一下示例:
cfg.ReceiveEndpoint(host, queueName: "AnotherSubscirber2", configure: configurator =>
{
configurator.Handler<ObjectCreatedB>(context =>
{
Console.WriteLine("Another subscirber, object b created");
return Task.CompletedTask;
});
});
第二个参数的名称为queueName,但用作主题的订户名称。当我使用publishEndpoint.Publish<ObjectCreatedB>
发布事件时,可以处理此消息。
因此,MT创建了有关以下主题的订阅:
它如何知道需要听ObjectCreatedB
?队列名称为AnotherSubscirber2
,但MT创建了订阅AnotherSubscirber2
。参数命名正确吗?
如果添加此代码,我仍然会完成相同的操作:
cfg.SubscriptionEndpoint<ObjectCreatedB>(host, subsriberName, configurator =>
{
configurator.Consumer<ObjectBCreatedEventHandler>();
});
那有什么区别?我该如何注册命令处理程序而不是事件处理程序呢?还是我错过了什么?我的示例代码是here。
谢谢!
答案 0 :(得分:0)
RecieveEndpoint
用于预订Azure Service Bus队列(您可以传递队列名称),而SubscriptionEndpoint
用于预订Azure Service Bus主题订阅(您可以传递主题路径和订阅名称)。
在MassTransit documentation中有关发送与发布的更多信息。