c# Rebus - 消息未发送到 RabbitMQ

c# Rebus - Message not being sent to RabbitMQ

我正在尝试从一个 API 发布一个事件并从多个其他 API 订阅这个事件。 我正在尝试使用 Rebus、RabbitMQ 和 .NET 5 来完成此任务。

无论我做什么,消息似乎都没有发送到队列中。

我的代码是这样的

正在发送API

Startup.cs - 配置服务

        services.AddRebus(configure => configure
            .Logging(x => x.Serilog())
            .Transport(x => x.UseRabbitMq("amqp://guest:guest@localhost:5672", "Bus.Users"))
            .Routing(x => x.TypeBased()
                .Map<UserUpdatedEvent>("Bus.Users")));

Startup.cs - 配置

            app.ApplicationServices.UseRebus();

触发发布的代码:

                var userUpdatedEvent = new UserUpdatedEvent
            {
                Id = user.Id,
                FirstName = user.FirstName,
                LastName = user.LastName,
                ProfileImageId = user.ProfileImageUuid,
                ProfileImageUrl = user.ProfileImageUrl
            };

            await _bus.Publish(userUpdatedEvent);

这段代码每次都会被触发,尽管我从未在 rabbitMQ 管理的队列或错误队列中看到消息。

我已经尝试解决这个问题很长一段时间了,但似乎找不到任何解决方案。 有人知道我做错了什么吗?

亲切的问候

这部分

.Routing(x => x.TypeBased()
                .Map<UserUpdatedEvent>("Bus.Users"))

告诉 Rebus 你希望 UserUpdatedEvent 类型的消息被路由到队列“Bus.Users”,这样当你

await bus.Send(new UserUpdatedEvent(...));

消息将被放入队列“Bus.Users”。

这是一个简单的 point-to-point channel,发件人将消息直接发送到收件人的输入队列。

在这种情况下,这可能不是您想要的,因为消息是一个事件。您通常使用 point-to-point 个频道来执行命令,例如UpdateUserCommand 指示收件人更新用户。

另一方面,当你

await bus.Publish(new UserUpdatedEvent(...));

Rebus 会根据事件类型生成一个主题 - 在您的例子中,它会被称为“Messages.UserUpdatedEvent, UserUpdatedEvent”,因为 Rebus 默认使用简称 assembly-qualified正在发布的类型的类型名称 - 并将事件发布到该主题。

为了能够接收发布到主题的事件,需要有人订阅它。在你的情况下,你只需让你的订阅者

await bus.Subscribe<UserUpdatedEvent>();

然后它将开始接收事件。这是一个 publish-subscribe channel,可以方便地将事件分发给 0..n 个订阅者。

我希望这是有道理的