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

NServiceBus: Receive on SqlTransport, send (forward) to MsmqTransport

假设我有一个 sql 服务器数据库和 table T。当 T 中的一行发生变化时,我想通过 NServicBus (Publish/Subscribe) 接收消息。

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

我查看了 SqlBridge 示例,但它是相反的(msmq -> sql 服务器)。我想不出 IAdcancedSatelite 从 sql 服务器传输接收的方法,即我似乎只能在 GetReceiverCustomization() 中创建 MsmqDequeueStrategy 类型的 IDequeueMessages。

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

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

2) 用其他通信方式(rpc 调用等)桥接端点。也许这可以通过网关和 bus.SendToSites 来完成?我是 NServiceBus 的新手,所以我没有研究过网关。

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

如有任何建议,我们将不胜感激。

最简单的解决方案可能是使用 SQLDependency 来检测 table T 中的变化,然后通过 NServiceBus 发布一个事件。

SQLDependecy 确实在后台使用了 SQL Service Broker,所以它确实需要启用,但是 (IIRC) 它不需要大量的设置来启动它并且运行.

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

以上要求您的触发器知道如何以 NServiceBus 期望在表示队列的 Sql 表中找到的原始 SQL 格式创建消息。对我来说,这不是可行的方法,因为您将依赖于 NServiceBus table 结构,该结构可以在不通知的情况下更改功能,因为它是一个实现细节。

我喜欢 Phil 的想法,即使 IIRC sql 依赖项遗漏了更改行的详细信息。我会选择混合:

  • 在触发器中使用更改的详细信息填充不同的 table;
  • 使用 Sql 对 "history" table 的依赖来响应变化;
  • 处理更改并将历史记录行标记为已处理或将其删除;