我正在嘗試從一個 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 管理的佇列或錯誤佇列中看到訊息。
我一直在嘗試解決這個問題很長一段時間,但似乎找不到任何解決方案。有人知道我做錯了什么嗎?
親切的問候
uj5u.com熱心網友回復:
這部分
.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 個訂閱者。
我希望這是有道理的??
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/482867.html
