ConsumerDefinition 中忽略了 MassTransit 端点名称
MassTransit endpoint name is ignored in ConsumerDefinition
ConsumerDefinition
文件中的 EndpointName
属性 似乎被 MassTransit 忽略了。我知道正在使用 ConsumerDefinition,因为重试逻辑有效。如何让不同的命令转到不同的队列?似乎我可以让它们全部通过一个中央队列,但我认为这不是命令的最佳实践。
这是我在创建 MassTransit 总线时在启动时执行的应用程序配置。
Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Host(_config.ServiceBusUri, host => {
host.SharedAccessSignature(s =>
{
s.KeyName = _config.KeyName;
s.SharedAccessKey = _config.SharedAccessKey;
s.TokenTimeToLive = TimeSpan.FromDays(1);
s.TokenScope = TokenScope.Namespace;
});
});
cfg.ReceiveEndpoint("publish", ec =>
{
// this is done to register all consumers in the assembly and to use their definition files
ec.ConfigureConsumers(provider);
});
以及我在消费者中的处理程序定义(一个 azure worker 服务)
public class CreateAccessPointCommandHandlerDef : ConsumerDefinition<CreateAccessPointCommandHandler>
{
public CreateAccessPointCommandHandlerDef()
{
EndpointName = "specific";
ConcurrentMessageLimit = 4;
}
protected override void ConfigureConsumer(
IReceiveEndpointConfigurator endpointConfigurator,
IConsumerConfigurator<CreateAccessPointCommandHandler> consumerConfigurator
)
{
endpointConfigurator.UseMessageRetry(r =>
{
r.Immediate(2);
});
}
}
在我发送消息的应用程序中,我必须将其配置为发送到 "publish" 队列,而不是 "specific"。
EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:specific")); // does not work
EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:publish")); // this does work
因为您是自己配置接收端点,并将其命名为 publish
,这就是接收端点。
要使用定义配置端点,请使用:
cfg.ConfigureEndpoints(provider);
这将使用容器中注册的定义来配置接收端点,使用定义的消费者端点名称。
这在documentation中也有解释。
ConsumerDefinition
文件中的 EndpointName
属性 似乎被 MassTransit 忽略了。我知道正在使用 ConsumerDefinition,因为重试逻辑有效。如何让不同的命令转到不同的队列?似乎我可以让它们全部通过一个中央队列,但我认为这不是命令的最佳实践。
这是我在创建 MassTransit 总线时在启动时执行的应用程序配置。
Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Host(_config.ServiceBusUri, host => {
host.SharedAccessSignature(s =>
{
s.KeyName = _config.KeyName;
s.SharedAccessKey = _config.SharedAccessKey;
s.TokenTimeToLive = TimeSpan.FromDays(1);
s.TokenScope = TokenScope.Namespace;
});
});
cfg.ReceiveEndpoint("publish", ec =>
{
// this is done to register all consumers in the assembly and to use their definition files
ec.ConfigureConsumers(provider);
});
以及我在消费者中的处理程序定义(一个 azure worker 服务)
public class CreateAccessPointCommandHandlerDef : ConsumerDefinition<CreateAccessPointCommandHandler>
{
public CreateAccessPointCommandHandlerDef()
{
EndpointName = "specific";
ConcurrentMessageLimit = 4;
}
protected override void ConfigureConsumer(
IReceiveEndpointConfigurator endpointConfigurator,
IConsumerConfigurator<CreateAccessPointCommandHandler> consumerConfigurator
)
{
endpointConfigurator.UseMessageRetry(r =>
{
r.Immediate(2);
});
}
}
在我发送消息的应用程序中,我必须将其配置为发送到 "publish" 队列,而不是 "specific"。
EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:specific")); // does not work
EndpointConvention.Map<CreateAccessPointsCommand>(new Uri($"queue:publish")); // this does work
因为您是自己配置接收端点,并将其命名为 publish
,这就是接收端点。
要使用定义配置端点,请使用:
cfg.ConfigureEndpoints(provider);
这将使用容器中注册的定义来配置接收端点,使用定义的消费者端点名称。
这在documentation中也有解释。