4

我是 NServiceBus 的新手,并且正在尝试做一些看起来比它应该做的更难的事情......所以如果我错过了关于 nsb 更大图景的一些东西,我就会开始徘徊。

这是场景:

  • 将 WCF 终结点公开给他们请求长时间运行的操作的客户端。
  • 我想将入站请求映射到 NServiceBus 消息。
  • 将消息发布到总线进行处理。
  • 向客户发送回复,确认他们的请求已收到,我们将开始处理它。
  • Bus 通过处理程序处理消息。
  • 工作完成后,在他们的“回调”端点 (wcf) 上回叫客户端,以向他们提供他们发出的长时间运行请求的结果。

我欢迎可能有用的纠正性批评、示例或链接。先感谢您!

4

3 回答 3

2

您可以通过 NSB 管道执行此操作。您可以配置处理程序以按照您指定的顺序执行。在您的情况下,这将与通知一起结束。根据用例,将通知转发到仅处理这些类型的通信的另一个端点可能会更好。您需要考虑的是故障场景。如果处理程序失败并且消息被重试,会发生什么?

这一切都基于您不需要维护状态的想法。如果你这样做了,那么你会想要考虑使用Saga。这将保持每个长时间运行的事务的状态,并为您提供一些您可能需要的更多功能,例如超时。

于 2012-09-04T13:17:39.777 回答
1

长时间运行的进程可以是同步的也可以是异步的。不可能两者兼而有之。

您可以使用 NServiceBus 异步处理长时间运行的任务并生成进度信息。亚当提到了传奇。您可以使用 saga 来跟踪进度。它还将帮助您将流程划分为更细粒度的任务,并提供诸如自动重试之类的免费处理瞬时故障的功能。

但是,您将不得不使用另一种机制将进度信息发送回用户。定期轮询、长轮询、隐藏 iframe、websocket 等等 - 看看 SignalR 公开的想法。这里有一个很好的视频,它讨论了向浏览器发送通知。

于 2012-09-05T11:02:22.437 回答
1

根据 NServiceBus网站,您可以将 NSB 端点公开为 WCF 服务:

互操作性

只需一行代码和标准的 WCF 配置,您就可以将 NServiceBus 端点公开为 WCF 服务。您需要做的就是编写一个从 NServiceBus.WcfService 继承的空类,指定请求和响应的类型,然后 NServiceBus 完成其余工作,如下所示:

public class MyService : NServiceBus.WcfService<MyCommand, MyErrorCodes> { }

我已经完成了一些将遗留 MSMQ 客户端与 NServiceBus 集成的工作——它可以工作,但您必须确保消息构造正确。

发送到 NServiceBus 端点的消息必须包含在<Messages/>信封中并且必须具有命名空间。例如:

<Messages xmlns="http://tempuri.net/MyNservicebusMessage">
  <MyNservicebusMessage body/> ...etc
</Messages>

此外,如果你想使用 NServiceBus 审计,你必须确保 MSMQ“响应队列”消息头有一个值,尽管我认为这个值并不重要。

于 2012-09-04T08:49:56.190 回答