1

我试图让VideoStore.NHibernateNServiceBus 示例(来自Github)使用SqlServerTransport而不是 MSMQ 工作(我们不想依赖 MSMQ 或 RavenDb)。

通过执行以下操作,我已将此示例切换为使用 SqlServerTransport 而不是 MsmqTransport:

  • 为 NserviceBus.SqlServer 添加适当的 NuGet 包
  • 将适当的连接字符串添加到每个 app/web.config

当我使用这些新设置运行示例时,我注意到NServiceBus.ExtensionMethods 静态类有一个调用的方法,当我切换到 SqlServerTransport 时SetMessageHeader会抛出一个:InvalidOperationException

public static void SetMessageHeader(this ISendOnlyBus bus, object msg, string key, string value)
{
    IManageMessageHeaders manageMessageHeaders = bus as IManageMessageHeaders;
    if (manageMessageHeaders == null)
        throw new InvalidOperationException("bus does not implement IManageMessageHeaders");
    manageMessageHeaders.SetHeaderAction(msg, key, value);
}

这是否意味着SqlServerTransport不支持消息头?

SQL Server 传输不支持与我们的决定相关的其他任何内容吗?

是否有可用的功能/传输矩阵?

更新:

好吧,也许我在这里跳过了枪。https://github.com/Particular/NServiceBus.SqlServer.Samples似乎暗示 SqlServerTransport 确实支持消息头和 Sagas。

更新二

看来您对持久性 (NHibernatePeristence) 和传输 (SqlServerTransport) 使用相同的数据库会导致问题。为每个角色使用单独的数据库似乎已经解决了这个问题。

我仍然想知道在功能支持方面使用 SqlServerTransport 是否有任何缺点?

4

1 回答 1

1

与 MSMQ 相比,使用 SQLServer 传输时没有功能退化。与 NHibenrnate 持久性集成可以正常工作,但需要启用“DistributedTransactions”(默认)。请注意,如果传输和持久性连接字符串相同,它实际上不会升级为 DTC(没有性能损失)

于 2015-02-10T04:51:22.463 回答