2012-09-04 42 views
4

我是NServiceBus的新手,我正在尝试做比自己应该更难的事情......所以我开始漫步,如果我错过了关于nsb更大图片的东西。Async WCF与NServiceBus的集成

下面是这种情况:

  • 暴露WCF端点客户从他们要求一个长时间运行的操作。
  • 我想将入站请求映射到NServiceBus消息。
  • 将消息发布到总线进行处理。
  • 发送一个回复给客户acking他们的请求已收到,我们将开始处理它。
  • 总线通过处理程序处理消息。
  • 工作完成后,在客户端的“回调”端点(wcf)上调用客户端,使他们获得他们所做的长时间运行请求的结果。

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

+0

您正在使用哪个WCF绑定? –

+0

@Chris我不知道会有什么不同吗?我无法使用wcf回调合约(我不认为)。我们将运行IIS 7,很可能是wsHttp。 –

回答

1

按照NServiceBus website,可以使您的NSB端点作为WCF服务:

互操作性

您可以用尽可能 少一行代码暴露你的NServiceBus端点为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“响应队列”消息头有一个值,虽然我不觉得值事宜。

+0

不过,此解决方案适用于同步场景。我的方案的关键点是我有一个长期运行的任务,并且需要在获得结果后再打回客户端。 –

2

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

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

1

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

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

但是,您将不得不使用另一种机制将进度信息发回给用户。定期轮询,长时间轮询,隐藏的iframe,websockets,无论 - 看看由SignalR公开的想法。有一个很好的视频here谈到向浏览器发送通知。