异步WCF与NServiceBus集成

时间:2012-09-04 02:40:22

标签: c# wcf asynchronous nservicebus

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

以下是该方案:

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

我欢迎可能有用的纠正批评,示例或链接。提前谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

  

互操作性

     

您可以将NServiceBus端点公开为带有as的WCF服务   很少作为一行代码和标准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“响应队列”消息头具有值,尽管我认为该值不重要。

答案 2 :(得分:1)

长时间运行的进程可以是同步的也可以是异步的。它不可能都是。

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

但是,您必须使用其他机制将进度信息发送回用户。定期轮询,长轮询,隐藏iframe,websockets等等 - 看看SignalR公开的想法。有一个很好的视频here,讨论向浏览器发送通知。