rabbitmq MassTransit事务发件箱继承事件

w1e3prcc  于 2023-03-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(130)

我有一个继承自另一个类的类。这两个类都是事件,我使用MassTransit和RabbitMQ使用它们。示例:

public class EventBase {}

public class CreatedEvent : EventBase {}

public class CreatedEventConsumer : IConsumer<CreatedEvent> {}

public class EventBaseConsumer : : IConsumer<EventBase> {}

到目前为止,当我发布CreatedEvent时,它会在RabbitMQ上创建2个交换,每个事件1个,并绑定它们。因此,发布CreatedEvent将为两个队列(CreatedEventConsumer和EventBaseConsumer)发送消息。
现在我开始在8.0.8版本的MassTransit上使用Transactional Outbox,它不会在交换机之间创建绑定,如果绑定已经存在于RabbitMQ上,那么它可以正常工作,我会在两个队列上接收消息,但是如果绑定不存在,那么它不会创建绑定,我只会在CreatedEventConsumer队列上接收消息。
知道为什么会这样吗?

gpnt7bae

gpnt7bae1#

事务发件箱不知道代理交换拓扑,这意味着对于仅通过事务发件箱发布的消息类型,可能需要将这些类型告知MassTransit,以便可以在总线启动时配置它们。
要在总线启动时(而不是消息发布时)部署拓扑,可以将发布的消息类型添加到总线配置中,并将DeployPublishTopology设置为true,如下所示。

x.UsingRabbitMq((context, cfg) =>
{
    cfg.Publish<CreatedEvent>();

    cfg.DeployPublishTopology = true;

    // the rest 
});

这将确保在启动时创建CreatedEvent和所有基/继承类型交换。
您还可以使用AddPublishMessageTypes添加多个消息类型。

相关问题