【问题标题】:Why is NServiceBus configuration broken after using TypesToScan()为什么使用 TypesToScan() 后 NServiceBus 配置被破坏
【发布时间】:2015-03-16 15:47:19
【问题描述】:

我有一个控制台应用程序,您可以在其中指定参数,根据指定的参数,将加载各种处理程序。例如:

prgm.exe nyse 
prgm.exe nasdaq

目标是在我的代码中我有INyseHandlersINasdaqHandlers,在第一种情况下,只有扩展前者的任何处理程序被加载,对于后者的情况类似。目标是拥有一个程序,它可以根据其运行方式收听各种或所有来源。为了实现这一点,我已经设置了我上面提到的接口。然后在我的配置设置中:

var configuration = new BusConfiguration();
configuration.InitializeStepBusConventions(); // extension method, not the problem

// Load all the handlers specified in command line arguments
if (!Args.Contains("any") && Args.Length != 0)
{
    List<Type> handlersToLoad = new List<Type>();

    foreach (var argument in Args)
    {
        Console.WriteLine("Adding {0} subscribers to loaded handlers. . .", argument.ToUpper());

        switch (argument)
        {
            case "nyse":
                AddToHandlerList(handlersToLoad, typeof(INyseProcessor));
                break;
            case "nasdaq":
                AddToHandlerList(handlersToLoad, typeof(INasdaqProcessor));
                break;        
        }
    }

    configuration.TypesToScan(handlersToLoad);
}

configuration.UseContainer<NinjectBuilder>(c => c.ExistingKernel(Kernel));
configuration.EndpointName(ConfigurationManager.AppSettings[Defaults.Project.DefaultEndPointName]);
NServiceBus.Logging.LogManager.Use<NLogFactory>();

Bus.Create(configuration).Start();  

在哪里:

private void AddToHandlerList(List<Type> handlersToLoad, Type interfaceType)
{
    List<Type> classesWhichExtendInterface = Assembly.GetExecutingAssembly().GetTypes().Where(t => interfaceType.IsAssignableFrom(t)).ToList();
    classesWhichExtendInterface.Remove(interfaceType);

    handlersToLoad.AddRange(classesWhichExtendInterface);
} 

类型按预期加载,List 很好。但是当我运行它并到达Bus.Start 行时,我收到以下错误:

The given key (NServiceBus.LocalAddress) was not present in the dictionary.

如果不加载类型,默认行为可以正常工作,并且程序集中的所有处理器都已加载。为什么运行TypesToScan() 行后出现此错误?

编辑:这是扩展方法:

config.UseSerialization<JsonSerializer>();
config.UseTransport<RabbitMQTransport>();

config.UsePersistence<InMemoryPersistence>();
config.EnableInstallers();

return config;

【问题讨论】:

  • 我认为通过这样做,您只允许它获取您的处理程序,并且删除所有其他内容,例如消息、传输、配置。
  • 我认为这是一个公平的假设,似乎TypesToScan 假设您是从头开始并完全放弃了默认设置的其余部分。知道如何检索使其正常运行所需的那些吗?
  • 我不确定。我建议在列表已填充时删除不需要的处理程序,但我不确定何时放置此代码的正确交叉点。我仍然认为将处理程序拆分到两个不同的项目是最简单的。
  • 该错误消息很奇怪,当在内存中的OverridesDefaults 设置集合中找不到配置设置时会抛出该错误消息。只是出于好奇,您使用的是什么传输机制,因为NServiceBus.Local 不是核心组件中的关键(除非它隐藏在某个地方)?
  • 使用 RabbitMQ 作为传输层

标签: c# nservicebus


【解决方案1】:

你的异常发生在这里

localAddress = Address.Parse(Settings.Get<string>("NServiceBus.LocalAddress"));

Settings 获取由传输设置的“NServiceBus.LocalAddress”kvp。由于您没有使用“核心”传输 (MSMQ),因此我可能怀疑您的传输程序集类型需要包含在 TypesToScan 中,因为:

ForAllTypes<Feature>(TypesToScan, t => featureActivator.Add(t.Construct<Feature>()));

我在使用 SQL Server 传输时遇到了类似的问题,当我将程序集列表发送到 With(assemblies) 并且没有在其中包含 NServiceBus 程序集时,传输无法初始化。一旦我添加了 NServiceBus.* 程序集,一切就开始工作了。

【讨论】:

  • 我还是有点糊涂,我有参考NServiceBus.Transports.RabbitMQ,不知道你能不能再扩展一点?
  • 您需要从该程序集中获取类型并将它们添加到您的 TypesToScan 集合中,例如 handlersToLoad.AddRange(Assembly.GetAssembly(typeof (NServiceBus.Transports.RabbitMQ)).ExportedTypes)
  • 这似乎是正确的方向,在加载以下内容后:handlersToLoad.AddRange(Assembly.Load("NServiceBus.Transports.RabbitMQ").GetTypes()); 代码不再中断,但所需的处理程序从未执行,尽管已加载。我还应该加载NServiceBus.HostNServiceBus.Core 吗?
  • 嗯,值得一试:)
  • 您是否也包含了您的消息类型?
【解决方案2】:

我想为任何可能发现与我的情况相似的人添加一个答案,我在使用NServiceBus.Testing 测试传奇时遇到了这个确切的错误。

当您运行Test.Initialize 来设置您的单元测试时,您实际上可以传递一些BusConfiguration 设置,您可以在其中指定要扫描的程序集。我通常使用以下作为标准设置,如果您正在调试测试(至少使用 NUnit),它可以防止某些程序集加载问题:

Test.Initialize(conf => conf.AssembliesToScan(assembly.GetExecutingAssembly()))

但是,由于我不知道的原因,今天我正在设置一个 saga 测试并收到此问题中提到的 NServiceBus.LocalAddress 错误。我设法通过向AssembliesToScan 添加一个附加参数来解决这个问题,如下所示:

Test.Initialize(conf => conf.AssembliesToScan(
            Assembly.GetExecutingAssembly(),
            Assembly.GetCallingAssembly()));

希望这对某人有所帮助。

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多