【问题标题】:Do Sagas work with Unobtrusive Mode?Sagas 可以在不显眼模式下工作吗?
【发布时间】:2013-11-06 19:42:00
【问题描述】:

我有一个名为 UploadService 的端点,其中包含一个由另一个程序集中定义的命令启动的 saga。该程序集中的命令通过以下行在端点的初始化中注册:

public class EndpointInitialization : IWantCustomInitialization
    {
        public void Init()
        {
            NServiceBus.Configure.Features.Enable<NServiceBus.Features.Sagas>();

            NServiceBus.Configure.With()
              .Log4Net()
              .UseInMemoryTimeoutPersister()
              .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
              .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.Contains("Messages"))
              .UnicastBus()
                 .ImpersonateSender(false)
              .CreateBus()
              .Start();
        }
    }

但是,当通过 Debug->Start new instance 启动端点时,NServiceBus.Core 会抛出以下异常:

“传奇 'MySaga' 实现了 'IHandleMessages`1' 但消息类型 'MyCommand' 未被归类为消息。您应该使用 'Unobtrusive Mode Messages' 或者消息应该实现 'IMessage'、'IEvent ' 或 'ICommand'。”

我有一个单独的端点,它引用了相同的命令程序集,并以相同的方式定义了自定义初始化,并且启动得很好(唯一的区别是另一个端点不使用 sagas)。

更新:我正在使用 NServiceBus 4.2

【问题讨论】:

  • 你能在 github 上创建一个 issue 并发给我们一个 repro 吗?
  • 会做 - 也许我使用此功能错误,但问题似乎在于将我的消息定义放在与我的端点配置分开的自定义初始化类中。当我在与端点配置相同的类中指定初始化时,它可以正常启动。

标签: nservicebus saga nservicebus4


【解决方案1】:

是的。 Sagas 确实在不显眼的模式下工作。在实现 IConfigureThisEndpoint 的类中调用您的初始化代码,在该类中创建 Bus 的实例,这应该可以为您解决问题。

例如:

 public class EndpointConfig: IConfigureThisEndpoint, AsA_Publisher,  IWantCustomInitialization
{
    public void Init()
    {
        var container = new WindsorContainer();
        Configure.With()
            .CastleWindsorBuilder(container)
            .FileShareDataBus(@"..\..\..\DataBusShare\")
            .DefiningDataBusPropertiesAs(p => p.Name.EndsWith("DataBus"))
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith("Commands"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith("Events"))
            .DefiningMessagesAs(t => t.Namespace == "Messages")
            .DefiningEncryptedPropertiesAs(p => p.Name.StartsWith("Encrypted"))
            .UseNHibernateSagaPersister()
            .UseNHibernateTimeoutPersister()
            .UseNHibernateSubscriptionPersister();
        Configure.Serialization.Json();

    }
}

【讨论】:

  • 有趣。然而,这成功了,NSB 不是设计为在一个单独的类中使用我的自定义初始化吗?对于不使用 sagas 的端点来说,将消息定义放在单独的自定义初始化类中似乎不是问题。
  • 您可以拥有多个实现 IWantCustomInitialization 的类,而不会出现任何问题。但是,在这些类中引用总线,您将使用 Configure.Instance。而不是 Configure.With()
  • 尝试在单独的类中使用 Configure.Instance,仍然得到相同的异常。将我的 init 放在我的端点配置中似乎是解决这个问题的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 2015-11-07
  • 2014-07-19
相关资源
最近更新 更多