【问题标题】:Async WCF integration with NServiceBus与 NServiceBus 的异步 WCF 集成
【发布时间】:2012-09-04 02:40:21
【问题描述】:

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

这是场景:

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

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

【问题讨论】:

  • 您使用的是哪些 WCF 绑定?
  • @Chris 我不确定这会有什么不同?我将无法使用 wcf 回调合约(我不认为)。我们将运行 IIS 7,很可能是 wsHttp。

标签: c# wcf asynchronous nservicebus


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      互操作性

      您可以将 NServiceBus 端点公开为 WCF 服务,使用 as 只需一行代码和标准的 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“响应队列”消息头有一个值,虽然我不认为这个值很重要。

      【讨论】:

      • 不过,此解决方案适用于同步方案。我的场景的关键点是我有一个长时间运行的任务,需要在获得结果后回调客户端。
      猜你喜欢
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多