NServiceBus:在SqlTransport上接收,发送(转发)到MsmqTransport

时间:2015-01-16 12:43:15

标签: sql-server nservicebus

假设我有一个带有表T的sql server数据库。当T中的一行发生变化时,我希望通过NServicBus(发布/订阅)收到一条消息。

我将使用T上的触发器模拟已发送的消息,该触发器在NServiceBus订阅者(SqlServerTransport)轮询的表中插入消息。在消息处理程序中,我想将此消息发布(转发)给另一个NServiceBus订阅者(MsmqTransport)。

我已经查看了SqlBridge示例,但它反过来了(msmq - > sql server)。我无法找到IAdcancedSatelite从sql server传输接收的方法,即我似乎只能在GetReceiverCustomization()中创建MsmqDequeueStrategy类型的IDequeueMessages。

这甚至可能吗?如果没有,我的选择似乎是:

1)在整个系统中使用SqlServerTransport。我宁愿不这样做。

2)使用其他一些通信方式(rpc调用等)对端点进行布局。也许这可以通过网关和bus.SendToSites来完成。我是NServiceBus的新手,所以我没有查看网关。

3)还有别的吗?我见过使用sql server服务代理的解决方案。我们的DBA不喜欢这样。

任何建议表示赞赏。

2 个答案:

答案 0 :(得分:0)

最简单的解决方案可能是使用SQLDependency检测表T中的更改,然后通过NServiceBus发布事件。

SQLDependecy确实使用了SQL Service Broker,因此需要启用它,但是(IIRC)它不需要很多设置就可以启动并运行它。

答案 1 :(得分:0)

使用V5,您可以在同一个端点实例中托管多个总线实例,因为您可以使用SqlTransport连接到SQL,另一个连接到MSMQ。

以上要求您的触发器知道如何以NServiceBus期望在代表队列的Sql表中找到的原始SQL格式创建消息。对我而言,这不是要走的路,因为你将依赖于NServiceBus表结构,该表结构可以在没有任何通知的情况下改变,因为它是一个实现细节。

我喜欢Phil的想法,即使IIRC sql依赖错过了更改行的细节。我会选择混合:

    触发器中的
  • 使用更改的详细信息填充另一个表;
  • 使用“历史”表上的SqlDependency来响应更改;
  • 处理更改并将历史记录行标记为已处理或删除;