首页 > 解决方案 > 了解 MassTransit 中的 SubscribtionEndpoint 和 RecieveEndpoint

问题描述

我正在尝试结合 Azure 服务总线来了解 MassTransit 配置。

在配置时有 2 种重载方法:SubscriptionEndpoint<T>RecieveEndpoint. 我如何理解 MT 和 ASB 的消息传递是如何工作的。

有两种消息:事件和命令。事件通过Publish<T>方法发布并传递到主题。它们可以被许多不同的应用程序使用。命令通过Send<T>方法发送并传递到队列。来自队列的消息只被消费一次(例如并发读者)。

所以,我认为 SubscritionEndpoint 代表事件的配置,因此它具有<T>通过类型约定进行路由,而 RecieveEndpoint 用于连接命令发送者和命令处理程序。

但是我的测试应用程序说,无论我使用 SubscritionEndpoint 或 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>();
});

那么,有什么区别呢?那么如何注册命令处理程序而不是事件处理程序?还是我错过了什么?我的示例代码在这里

提前致谢!

标签: masstransit

解决方案


RecieveEndpoint用于订阅 Azure 服务总线队列(您可以传递队列名称),而用于SubscriptionEndpoint订阅 Azure 服务总线主题订阅(您可以传递主题路径和订阅名称)。

MassTransit 文档中有关发送与发布的更多信息。


推荐阅读