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 个订阅者。
我希望这是有道理的
我正在尝试从一个 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 个订阅者。
我希望这是有道理的