【发布时间】:2021-06-11 12:17:06
【问题描述】:
如果我向特定队列发送消息,在创建队列之前,将自动为我创建一个队列。
问题在于,当添加新消息/队列时,它会导致一种竞争条件。如果我的生产者服务在消费者服务启动之前启动并产生一条消息,那么将使用默认值创建一个新队列。当消费者服务启动时,我希望它会使用我想要的特定配置重新配置现有队列,但它不会改变任何东西(AutoDeleteOnIdle、MaxSizeInMegabytes 等)。
有推荐的方法吗? :thinking: 接收(和订阅端点)是否应该由所有服务全局配置,以便“第一个获胜”?
生产者服务:
private void ConfigureMassTransit(IServiceCollection services, string asbConnectionString)
{
services.AddMassTransit(x =>
{
x.UsingAzureServiceBus((context, cfg) =>
{
cfg.Host(asbConnectionString);
});
});
services.AddMassTransitHostedService(true);
}
...
private async SendAsync() {
var sendEndpoint = await _bus.GetSendEndpoint(IMyCommand.QueueUri);
await sendEndpoint.Send<IMyCommand>(new MyCommand { CommandText = $"The time is {DateTimeOffset.Now}" });
}
消费者服务:
private void ConfigureMassTransit(IServiceCollection services, string asbConnectionString)
{
services.AddMassTransit(x =>
{
x.AddConsumer<MyCommandConsumer>();
x.UsingAzureServiceBus((context, cfg) =>
{
cfg.Host(asbConnectionString);
cfg.ReceiveEndpoint(IMyCommand.QueueName, configurator =>
{
configurator.PublishFaults = false;
configurator.AutoDeleteOnIdle = TimeSpan.FromDays(30);
configurator.MaxSizeInMegabytes = 2048;
configurator.ConfigureConsumeTopology = false;
configurator.ConfigureConsumer<MessageCommandConsumer>(context, consumerConfigurator =>
{
consumerConfigurator.UseConcurrencyLimit(20);
consumerConfigurator.UseMessageRetry(r => r.Interval(2, 100));
});
});
});
});
services.AddMassTransitHostedService(true);
}
【问题讨论】:
标签: azureservicebus masstransit azure-servicebus-queues