NServiceBus 5与RabbitMQ传输在启用UnicastBus时抛出异常

时间:2014-12-03 15:29:00

标签: rabbitmq nservicebus

我正在尝试在自托管方案中使用NServiceBus和RabbitMQ。我已经在github上获得了NServiceBus和NServiceBus.RabbitMQ repos的源代码来追踪我到目前为止所遇到的问题,所以我使用的版本是他们昨天的回购源。

这是我的配置:

        var busConfiguration = new BusConfiguration();
        busConfiguration.EndpointName("RMAQueue");
        busConfiguration.AssembliesToScan(typeof(RMACommand).Assembly);
        busConfiguration.Conventions()
            .DefiningCommandsAs(type => type.Namespace != null && type.Namespace.StartsWith("RMAInterfaces.Commands.", StringComparison.Ordinal));
        busConfiguration.Conventions()
            .DefiningEventsAs(type => type.Namespace != null && type.Namespace.StartsWith("RMAInterfaces.Events.", StringComparison.Ordinal));
        busConfiguration.Conventions()
            .DefiningMessagesAs(type => type.Namespace != null && type.Namespace.StartsWith("RMAInterfaces.Messages.", StringComparison.Ordinal));
        busConfiguration.UseTransport<RabbitMQTransport>();
        busConfiguration.Transactions().Disable();
        busConfiguration.PurgeOnStartup(true);
        busConfiguration.UseSerialization<NServiceBus.JsonSerializer>();

        busConfiguration.DisableFeature<SecondLevelRetries>();
        busConfiguration.DisableFeature<StorageDrivenPublishing>();
        busConfiguration.DisableFeature<TimeoutManager>();

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

        var bus = Bus.Create(busConfiguration);

我在Bus.Create()行上收到例外:

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

在启用了Feature UnicastBus之后,我发现它已经失败了。

这是我的应用配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    <section name="AuditConfig" type="NServiceBus.Config.AuditConfig, NServiceBus.Core" />
  </configSections>
  <MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />
  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Messages="RMAInterfaces" Endpoint="RMAQueue@localhost" />
    </MessageEndpointMappings>
  </UnicastBusConfig>
  <connectionStrings>
    <add name="NServiceBus/Transport" connectionString="host=localhost" />
    <add name="NServiceBus/Persistence" connectionString="host=localhost"/>
  </connectionStrings>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
  <!--<AuditConfig 
    QueueName="The address to which messages received will be forwarded."
    OverrideTimeToBeReceived="The time to be received set on forwarded messages, specified as a timespan see http://msdn.microsoft.com/en-us/library/vstudio/se73z7b9.aspx"  />-->
  <AuditConfig QueueName="audit" />
</configuration>

使用RabbitMQ传输自我托管NServiceBus我缺少什么?

2 个答案:

答案 0 :(得分:2)

我刚刚遇到了这个问题,并且正如安德烈亚斯建议的那样。我在配置代码中添加了以下内容......

configuration.AssembliesToScan(typeof(NServiceBus.Transports.RabbitMQ.IManageRabbitMqConnections).Assembly);

有了这个,NServiceBus.LocalAddress的错误消息就不再显示了。我的完整设置如下(代码,然后是配置文件)

[TestMethod]
public void TestMethod1()
{
    LogManager.Use<Log4NetFactory>();
    var configuration = new BusConfiguration();
    configuration.AssembliesToScan(typeof(NServiceBus.Transports.RabbitMQ.IManageRabbitMqConnections).Assembly);
    configuration.UseSerialization<JsonSerializer>();
    configuration.UseTransport<NServiceBus.RabbitMQTransport>();
    configuration.UsePersistence<InMemoryPersistence>();

    var bus = global::NServiceBus.Bus.Create(configuration);
    bus.Start();
}



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="MessageForwardingInCaseOfFaultConfig" type="NServiceBus.Config.MessageForwardingInCaseOfFaultConfig, NServiceBus.Core" />
    <section name="UnicastBusConfig" type="NServiceBus.Config.UnicastBusConfig, NServiceBus.Core" />
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, Log4net" />
  </configSections>

  <MessageForwardingInCaseOfFaultConfig ErrorQueue="error" />

  <connectionStrings>
    <add name="NServiceBus/Transport" connectionString="host=localhost" />
  </connectionStrings>

  <UnicastBusConfig>
    <MessageEndpointMappings>
      <add Assembly="TestNSBCreation" Endpoint="TestNSBCreation" />
    </MessageEndpointMappings>
  </UnicastBusConfig>

  <log4net>
    <root>
      <level value="DEBUG" />
      <appender-ref ref="LogFileAppender" />
      <appender-ref ref="ContactAppender" />
    </root>
    <appender name="LogFileAppender" type="log4net.Appender.RollingFileAppender">
      <param name="File" value="C:\logs\TestNSBCreation.log" />
      <param name="AppendToFile" value="true" />
      <rollingStyle value="Size" />
      <maxSizeRollBackups value="5" />
      <maximumFileSize value="10MB" />
      <staticLogFileName value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <param name="ConversionPattern" value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
      </layout>
    </appender>
  </log4net>

</configuration>

答案 1 :(得分:1)

Morgan Skinner的回答帮助我找出了问题的根本原因。我添加了建议的代码configuration.AssembliesToScan(typeof(NServiceBus.Transports.RabbitMQ.IManageRabbitMqConnections).Assembly);

之后,异常更具描述性。 NServiceBus.RabbitMQ包自动下载RabbitMQ.Client包。后一个软件包已更新为nuget上的最新版本,并且此创建的版本与NserviceBus.RabbitMQ所期望的版本和实际安装的版本之间存在冲突。我已经完全删除了两个软件包并重新安装了NserviceBus.RabbitMQ软件包,错误就消失了。也不再需要..assembliesToScan ...行。