【问题标题】:Nservicebus Sagas and Subscribing to EventsNservicebus Sagas 和订阅事件
【发布时间】:2012-04-06 18:10:53
【问题描述】:

在 NServiceBus 3.0.3 中,我写了一个传奇。根据我在 CQRS 范式中所看到的,当我们看到过去时,这应该与一个事件相吻合。我想确保我的传奇中没有业务逻辑。我在构建 saga 时的假设是,它将接收事件并根据传入的事件以及存储在 saga 中的某些数据元素发出命令。我遇到的问题是 Saga 默认情况下无法订阅已发布的事件。我已经尝试在 EndPointConfig 中设置 IWantToRunAtStartup 并在 Run 方法中执行

Bus.Subscribe<CustomerBilledEvent>();  

我尝试在 saga 的同一个程序集中创建一个处理程序,但仍然没有骰子。

我的 saga(由 Nservicebus.host.exe 托管)和发布者(控制台应用程序中的服务)的 app.config 都具有这样配置的消息端点

 <add Messages="Events.CustomerBilledEvent, Events" Endpoint="orderservice"/>

IHandleMessages 已在 Saga 上配置,映射已在 orderid 上配置。

IHandleMessages<CustomerBilledEvent>

ConfigureMapping<CustomerBilledEvent>(s => s.OrderId, m=> m.OrderId);

我有点不明白为什么我不能让 Saga 订阅这个活动。我知道他们默认情况下不会自动订阅,但是当我查看 Udi 和 John 的博客下的示例时,我看到过去时(IEvent?)被发送到 saga 并且他们发出 Bus.Send,我推断它是命令(ICommand)。

【问题讨论】:

  • CustomerBilledEvent 的发布者是“orderservice”端点吗?
  • 不,事件的发布者是另一个服务。我设置它的方式是 OrderService(可能应该重命名为 OrderSagaService)触发一个发送到 BillingService 的命令。 billingservice 将执行它的逻辑,然后发布 CustomerbilledEvent,我希望它可以找到它回到这个 orderservice 的方式来 A)标记 Saga 属性“customerbilled”,然后 B)触发下一个命令。这是我正在处理的所有示例代码,以更好地了解如何在 Sagas 中利用 ICommand 和 IEvent。如果不在基地,欢迎任何方向。
  • Sagas 在 3.0 中自动订阅,您是否设置了计费服务的订阅存储?还要确保它也使用 3.0.3?
  • 现在我正在使用内存提供程序,所有服务都在同一台机器上。您的建议是将传奇复制到每个服务中,以便可以通过相同的共享存储在本地接收发布,还是我可以使用另一种策略让传奇订阅这些事件?我将在今晚晚些时候验证是否为整个项目部署了 3.0.3。当我开始实施并在星期四收到通知时,我最初使用的是 3.0.1,我相信关于 3.0.3 的发布。
  • 计费服务升级到 3.0.3 没有变化。我还查看了错误队列,并没有在其中找到任何内容。是否有一些文档或示例可以使用 Sagas 和 IEvent/ICommand 消息进行介绍?

标签: events nservicebus saga


【解决方案1】:

所以问题在于您已经设置了您的 saga 尝试订阅“orderservice”端点以接收有关 CustomerBilledEvent 的通知,但该端点没有发布它。

【讨论】:

  • 完美!在我阅读您的答案的那一刻,我查看了我的代码,简直不敢相信我是如何一直错过的。在订单服务中进行了更改,说“发布者在那边”而不是“这是我希望你处理事件的地方”。再次感谢您指出这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
相关资源
最近更新 更多