启动NServiceBus时,IPersistTimeouts未注册异常

时间:2015-11-18 23:48:44

标签: azure nservicebus

我在Azure网站和Azure服务(实际是Web作业)中有NServiceBus。启动时,我遇到以下异常:

  

类型的第一次机会异常   发生'Autofac.Core.Registration.ComponentNotRegisteredException'   在Autofac.dll中

     

其他信息:请求的服务   'NServiceBus.Timeout.Core.IPersistTimeouts'尚未注册。   要避免此异常,请注册组件以提供   服务,使用IsRegistered()检查服务注册,或使用   ResolveOptional()方法来解析可选的依赖项。

启动代码:

    var busConfiguration = ServiceBusConfig.Configure("MyEndpointName");
    var startableBus = Bus.Create(busConfiguration);

    startableBus.Start();

配置:

public static class ServiceBusConfig
{
    public static BusConfiguration Configure(string endPointName)
    {
        var config = new BusConfiguration();
        var storageconnectionstring = CloudConfigurationManager.GetSetting("StorageConnectionString");
        var serviceBusConnectionString = CloudConfigurationManager.GetSetting("ServiceBusConnectionString");
        config.AssembliesToScan(AllAssemblies.Matching("NServiceBus").And("MYAPP."));
        config.CustomConfigurationSource(new ApplicationConfigurationSource());
        config.EndpointName(endPointName);
        config.UseSerialization<JsonSerializer>();
        config.UseContainer<AutofacBuilder>(c => c.ExistingLifetimeScope(ContainerService.Container));
        config.UsePersistence<AzureStoragePersistence, StorageType.Subscriptions>().ConnectionString(storageconnectionstring).TableName("Subscriptions");
        config.UsePersistence<AzureStoragePersistence, StorageType.Sagas>().ConnectionString(storageconnectionstring);
        config.UsePersistence<AzureStoragePersistence, StorageType.Timeouts>().ConnectionString(storageconnectionstring).TimeoutManagerDataTableName("TimeoutManager").TimeoutDataTableName("TimeoutData");
        config.UseTransport<AzureServiceBusTransport>().ConnectionString(() => serviceBusConnectionString);
        config.ScaleOut().UseSingleBrokerQueue();
        config.Transactions().Enable();
        config.EnableInstallers();

        ConfigureConventions(config.Conventions());

        return config;
    }

    private static void ConfigureConventions(ConventionsBuilder conventions)
    {
        conventions.DefiningCommandsAs(t => t.Namespace != null && t.Namespace.Contains("Commands"));
        conventions.DefiningEventsAs(t => t.Namespace != null && t.Namespace.Contains("Events"));
        conventions.DefiningMessagesAs(t => t.Namespace != null && t.Namespace.Contains("Messages"));
        conventions.DefiningEncryptedPropertiesAs(t => t.GetCustomAttributes(true).Any(a => a.GetType().Name == "EncryptedAttribute"));
        conventions.DefiningTimeToBeReceivedAs(t => t.Name.EndsWith("Expires")
            ? TimeSpan.FromSeconds(30)
            : TimeSpan.MaxValue);
    }
}

我正在尝试进行代码配置,所以这里是config.CustomConfigurationSource:

public class ApplicationConfigurationSource : IConfigurationSource
{
    public T GetConfiguration<T>() where T : class, new()
    {
        if (typeof(T) == typeof(RijndaelEncryptionServiceConfig))
        {
            return new RijndaelEncryptionServiceConfig
            {
                Key = "some key is here"
            } as T;
        }

        if (typeof(T) == typeof(AuditConfig))
        {
            return new AuditConfig
            {
                QueueName = "audit",
                OverrideTimeToBeReceived = TimeSpan.FromMinutes(10)
            } as T;
        }

        if (typeof(T) == typeof(MessageForwardingInCaseOfFaultConfig))
        {
            return new MessageForwardingInCaseOfFaultConfig
            {
                ErrorQueue = "error"
            } as T;
        }

        return ConfigurationManager.GetSection(typeof(T).Name) as T;
    }
}

虽然我已经使用了NServiceBus,但实际上不得不从头开始配置它并不经常发生,因此可能存在潜伏在某处的“新手”错误。

我试过config.DisableFeature<TimeoutManager>()但没有快乐。也就是说,如果我必须明确启用TimeoutManager,我不知道如何为Azure做这件事。

如何摆脱这个错误?

谢谢, R上。

0 个答案:

没有答案