我对与发布者和订阅者的应用程序请求有关的各种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();
答案 0 :(得分:0)
总线实例是完全可重入的,因此可以安全地跨线程使用。
通常,您只应创建一次总线实例,然后创建一次
BuiltinHandlerActivator
,或应用程序关闭时。
如果您使用的是Azure功能,则应使用“单向客户端”,这是不支持接收消息的总线实例的另一种说法-它仅能发送/发布。您可以在此处了解两种总线模式:Different bus modes
您可以在此处了解有关实例策略和线程安全性的更多信息:Thread safety and instance policies。