带有Rebus的BuiltinHandlerActivator和应用程序请求的生命周期

时间:2019-05-28 13:50:29

标签: rebus rebus-azureservicebus

我对与发布者和订阅者的应用程序请求有关的各种Rebus对象的生命周期有疑问:

请参见以下内容:

发布者

1以下代码在应用程序的生命周期内必须仅初始化一次吗?

例如,下面的BuiltinHandlerActivator实例被初始化一次,并在应用程序的整个生命周期中使用?

using (var activator = new BuiltinHandlerActivator())
{
    Log.Logger = new LoggerConfiguration()
        .WriteTo.ColoredConsole()
        .ReadFrom.Configuration(SerilogConfiguration)
        .Enrich.WithProperty("App Name", "Rebus Publisher")
        .CreateLogger();

    Configure.With(activator)
        .Logging(l =>
        {
            l.Serilog(Log.Logger);
        })
        .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Publisher))
        .Options(o =>
        {
            o.Decorate<IErrorHandler>(c => new MyErrorHandler(c.Get<IErrorHandler>()));

            o.SimpleRetryStrategy(maxDeliveryAttempts: 1, errorQueueAddress: "poison");
        })
        .Start();

2多个线程可以同时调用并使用下面的activator吗?

例如,如果有多个请求传入,Azure Function运行时将在下面创建Function的多个实例,每个实例都处理请求。

activator.Bus.Publish("test").Wait();

Subscriber1

类似的问题也适用于上述发布商

1以下代码在应用程序的生命周期内必须仅初始化一次吗? 例如,下面的BuiltinHandlerActivator实例被初始化一次,并在应用程序的整个生命周期中使用?

using (var activator = new BuiltinHandlerActivator())
{
    activator.Register(() => new Handler(MessageContext.Current));

    Configure.With(activator)
        .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
        .Transport(t => t.UseAzureServiceBus(Consts.ServiceBusConnectionString, Consts.Subscriber1))
        .Routing(r => r.TypeBased().MapAssemblyOf<string>(Consts.Publisher))
        .Options(o =>
        {
            //consumer only
            o.SimpleRetryStrategy(maxDeliveryAttempts: 2, errorQueueAddress: "poison");
            //consumer only
            o.SetNumberOfWorkers(7);
            o.SetMaxParallelism(10);
        }).Start();

2多个线程可以同时调用和使用激活器吗?

例如,如果有多个请求传入,Azure Function运行时将在下面创建Function的多个实例,每个实例都处理请求。

请注意,SetNumberOfWorkers和SetMaxParallelism都用于Subscriber1。

activator.Bus.Subscribe<string>().Wait();

1 个答案:

答案 0 :(得分:0)

总线实例是完全可重入的,因此可以安全地跨线程使用。

通常,您只应创建一次总线实例,然后创建一次

  • 处置总线实例,或
  • 处置BuiltinHandlerActivator,或
  • 处置用于保持总线实例的IoC容器

应用程序关闭时。

如果您使用的是Azure功能,则应使用“单向客户端”,这是不支持接收消息的总线实例的另一种说法-它仅能发送/发布。您可以在此处了解两种总线模式:Different bus modes

您可以在此处了解有关实例策略和线程安全性的更多信息:Thread safety and instance policies