【发布时间】: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