c# Rebus -消息未发送到RabbitMQ

avkwfej4  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(1)|浏览(250)

我尝试从一个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管理的队列或错误队列中看到消息。
我已经尝试解决这个问题很长一段时间了,但似乎找不到任何解决办法。有人知道我做错了什么吗?
谨致问候

neekobn8

neekobn81#

本部分

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

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

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

消息将被放入队列“业务用户”。
这是一个简单的point-to-point channel,发送者直接将消息发送到接收者的输入队列。
在这种情况下,这可能不是您想要的,因为消息是一个事件,您通常使用点对点通道来发送命令,例如UpdateUserCommand指示接收者更新用户。
另一方面,当你

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

Rebus将从事件类型中生成一个主题--在您的例子中,它将被命名为“Messages.UserUpdatedEvent,UserUpdatedEvent”,因为Rebus默认使用被发布的类型的简短的、汇编限定的类型名--并将事件发布到该主题。
为了能够接收发布到主题的事件,需要有人订阅它。

await bus.Subscribe<UserUpdatedEvent>();

然后它将开始接收事件。这是一个publish-subscribe channel,它对于将事件分发给0..n个订阅者非常方便。
我希望你说的有道理🙂

相关问题