我正在尝试从一个API发布事件,并从多个其他API订阅此事件。我正在尝试使用Rebus, RabbitMQ和。net 5来完成这个任务。
无论我做什么,消息似乎根本没有被发送到队列。
我的代码是这样的
<<p>发送API/strong>Startup.cs - ConfigureServices
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 - Configure
app.ApplicationServices.UseRebus();
触发publish:
的代码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"中。
这是一个简单的点对点通道,发送方将消息直接发送到接收方的输入队列。
在这种情况下,这可能不是您想要的,因为消息是一个事件。您通常使用点对点通道发送命令,例如UpdateUserCommand
指示接收方更新用户。
另一方面,当你
await bus.Publish(new UserUpdatedEvent(...));
Rebus将从事件类型中生成一个主题—在您的示例中,它将被称为"Messages之类的内容。UserUpdatedEvent, UserUpdatedEvent",因为Rebus默认使用正在发布的类型的简短的、程序集限定的类型名称,并将事件发布到该主题。
为了能够接收发布到主题的事件,需要有人订阅该主题。在您的例子中,您只需让订阅者
await bus.Subscribe<UserUpdatedEvent>();
,然后它将开始接收事件。这是一个发布-订阅通道,用于将事件分发到0..n用户。
我希望你明白🙂