MassTransit:消费者出现异常时引发的其他错误。 "The IErrorTransport was not available on the ReceiveContext."
MassTransit: Additional error raised when consumer has an exception. "The IErrorTransport was not available on the ReceiveContext."
我有一些消费者在已升级到 MT 6.0.2 和 Azure Functions 3 和核心 3 的 Azure Functions 中运行。当消费者遇到错误时,消息不会发送到错误队列并且记录了以下错误。
The IErrorTransport was not available on the ReceiveContext.
这是我的功能方法。我是否遗漏了有关配置接收器的内容?
public async Task ExecuteMessageConsumerAsync(
[ServiceBusTrigger(CoreEndpoint.InputQueue)] Microsoft.Azure.ServiceBus.Message message,
IBinder binder,
ILogger log,
CancellationToken cancellationToken)
{
LogContext.ConfigureCurrentLogContext(log);
LogContext.Info?.Log("Creating brokered message receiver");
await ContainerContext.ExecuteAsync(scope =>
{
var handler = Bus.Factory.CreateBrokeredMessageReceiver(binder, cfg =>
{
cfg.CancellationToken = cancellationToken;
cfg.InputAddress = _endpoint.InputQueueAddress;
cfg.UseInMemoryOutbox();
cfg.UseServiceBusMessageScheduler();
cfg.UseMessageRetry(r =>
{
r.Intervals(10, 100, 500, 1000);
r.Ignore<ApplicationException>();
});
cfg.ConfigureSend(x => x.UseTenantContext<int>(scope));
cfg.ConfigurePublish(x => x.UseTenantContext<int>(scope));
// Command consumers
cfg.Consumer<EmailCallbackConsumer>(scope, "message", (c, consume) => c.UseTenantContext<int>(consume));
});
return handler.Handle(message);
});
}
升级到 6.1 后。
---> MassTransit.TransportException: sb://no-host-configured/no-queue-specified => The IErrorTransport was not available on the ReceiveContext.
at MassTransit.Pipeline.Filters.ErrorTransportFilter.GreenPipes.IFilter<MassTransit.ExceptionReceiveContext>.Send(ExceptionReceiveContext context, IPipe`1 next)
at MassTransit.Pipeline.Filters.GenerateFaultFilter.GreenPipes.IFilter<MassTransit.ExceptionReceiveContext>.Send(ExceptionReceiveContext context, IPipe`1 next)
at GreenPipes.Filters.RescueFilter`2.GreenPipes.IFilter<TContext>.Send(TContext context, IPipe`1 next)
at MassTransit.Pipeline.Filters.DeadLetterFilter.GreenPipes.IFilter<MassTransit.ReceiveContext>.Send(ReceiveContext context, IPipe`1 next)
at MassTransit.Azure.ServiceBus.Core.Transport.BrokeredMessageReceiver.MassTransit.Azure.ServiceBus.Core.Transport.IBrokeredMessageReceiver.Handle(Message message, Action`1 contextCallback)
at MassTransit.Azure.ServiceBus.Core.Transport.BrokeredMessageReceiver.MassTransit.Azure.ServiceBus.Core.Transport.IBrokeredMessageReceiver.Handle(Message message, Action`1 contextCallback)
at Symend.Core.App.AzureFunctions.Functions.ExecuteMessageConsumerAsync(Message message, IBinder binder, ILogger log, CancellationToken cancellationToken) in D:\a\s\src\Core\Symend.Core.App.AzureFunctions\Functions.cs:line 53
at Microsoft.Azure.WebJobs.Host.Executors.VoidTaskMethodInvoker`2.InvokeAsync(TReflected instance, Object[] arguments) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\VoidTaskMethodInvoker.cs:line 20
at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.InvokeAsync(Object instance, Object[] arguments) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs:line 52
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker invoker, ParameterHelper parameterHelper, CancellationTokenSource timeoutTokenSource, CancellationTokenSource functionCancellationTokenSource, Boolean throwOnTimeout, TimeSpan timerInterval, IFunctionInstance instance) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 585
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstanceEx instance, ParameterHelper parameterHelper, ILogger logger, CancellationTokenSource functionCancellationTokenSource) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 532
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(IFunctionInstanceEx instance, ParameterHelper parameterHelper, IFunctionOutputDefinition outputDefinition, ILogger logger, CancellationTokenSource functionCancellationTokenSource) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 468
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(IFunctionInstanceEx instance, FunctionStartedMessage message, FunctionInstanceLogEntry instanceLogEntry, ParameterHelper parameterHelper, ILogger logger, CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 278
--- End of inner exception stack trace ---
at Microsoft.Azure.WebJobs.ServiceBus.MessageProcessor.CompleteProcessingMessageAsync(Message message, FunctionResult result, CancellationToken cancellationToken)
at Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener.ProcessMessageAsync(Message message, CancellationToken cancellationToken)
at Microsoft.Azure.ServiceBus.MessageReceivePump.MessageDispatchTask(Message message)```
使用带有最新开发包(将作为 6.1 发布)的 Azure Functions 时,故障消息将不会移动到 _error 队列,而是抛出异常,以便 Azure 可以将该消息移至死信队列。在 6.0.1 中有一个问题,在 6.0.2 中有一个后续问题(与 IDeadLetterTransport 相关)。
尝试最新的软件包 (-develop),如果问题解决了请告诉我。否则,那里可能还隐藏着另一个错误。
我有一些消费者在已升级到 MT 6.0.2 和 Azure Functions 3 和核心 3 的 Azure Functions 中运行。当消费者遇到错误时,消息不会发送到错误队列并且记录了以下错误。
The IErrorTransport was not available on the ReceiveContext.
这是我的功能方法。我是否遗漏了有关配置接收器的内容?
public async Task ExecuteMessageConsumerAsync(
[ServiceBusTrigger(CoreEndpoint.InputQueue)] Microsoft.Azure.ServiceBus.Message message,
IBinder binder,
ILogger log,
CancellationToken cancellationToken)
{
LogContext.ConfigureCurrentLogContext(log);
LogContext.Info?.Log("Creating brokered message receiver");
await ContainerContext.ExecuteAsync(scope =>
{
var handler = Bus.Factory.CreateBrokeredMessageReceiver(binder, cfg =>
{
cfg.CancellationToken = cancellationToken;
cfg.InputAddress = _endpoint.InputQueueAddress;
cfg.UseInMemoryOutbox();
cfg.UseServiceBusMessageScheduler();
cfg.UseMessageRetry(r =>
{
r.Intervals(10, 100, 500, 1000);
r.Ignore<ApplicationException>();
});
cfg.ConfigureSend(x => x.UseTenantContext<int>(scope));
cfg.ConfigurePublish(x => x.UseTenantContext<int>(scope));
// Command consumers
cfg.Consumer<EmailCallbackConsumer>(scope, "message", (c, consume) => c.UseTenantContext<int>(consume));
});
return handler.Handle(message);
});
}
升级到 6.1 后。
---> MassTransit.TransportException: sb://no-host-configured/no-queue-specified => The IErrorTransport was not available on the ReceiveContext.
at MassTransit.Pipeline.Filters.ErrorTransportFilter.GreenPipes.IFilter<MassTransit.ExceptionReceiveContext>.Send(ExceptionReceiveContext context, IPipe`1 next)
at MassTransit.Pipeline.Filters.GenerateFaultFilter.GreenPipes.IFilter<MassTransit.ExceptionReceiveContext>.Send(ExceptionReceiveContext context, IPipe`1 next)
at GreenPipes.Filters.RescueFilter`2.GreenPipes.IFilter<TContext>.Send(TContext context, IPipe`1 next)
at MassTransit.Pipeline.Filters.DeadLetterFilter.GreenPipes.IFilter<MassTransit.ReceiveContext>.Send(ReceiveContext context, IPipe`1 next)
at MassTransit.Azure.ServiceBus.Core.Transport.BrokeredMessageReceiver.MassTransit.Azure.ServiceBus.Core.Transport.IBrokeredMessageReceiver.Handle(Message message, Action`1 contextCallback)
at MassTransit.Azure.ServiceBus.Core.Transport.BrokeredMessageReceiver.MassTransit.Azure.ServiceBus.Core.Transport.IBrokeredMessageReceiver.Handle(Message message, Action`1 contextCallback)
at Symend.Core.App.AzureFunctions.Functions.ExecuteMessageConsumerAsync(Message message, IBinder binder, ILogger log, CancellationToken cancellationToken) in D:\a\s\src\Core\Symend.Core.App.AzureFunctions\Functions.cs:line 53
at Microsoft.Azure.WebJobs.Host.Executors.VoidTaskMethodInvoker`2.InvokeAsync(TReflected instance, Object[] arguments) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\VoidTaskMethodInvoker.cs:line 20
at Microsoft.Azure.WebJobs.Host.Executors.FunctionInvoker`2.InvokeAsync(Object instance, Object[] arguments) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionInvoker.cs:line 52
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.InvokeAsync(IFunctionInvoker invoker, ParameterHelper parameterHelper, CancellationTokenSource timeoutTokenSource, CancellationTokenSource functionCancellationTokenSource, Boolean throwOnTimeout, TimeSpan timerInterval, IFunctionInstance instance) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 585
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithWatchersAsync(IFunctionInstanceEx instance, ParameterHelper parameterHelper, ILogger logger, CancellationTokenSource functionCancellationTokenSource) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 532
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(IFunctionInstanceEx instance, ParameterHelper parameterHelper, IFunctionOutputDefinition outputDefinition, ILogger logger, CancellationTokenSource functionCancellationTokenSource) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 468
at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.ExecuteWithLoggingAsync(IFunctionInstanceEx instance, FunctionStartedMessage message, FunctionInstanceLogEntry instanceLogEntry, ParameterHelper parameterHelper, ILogger logger, CancellationToken cancellationToken) in C:\projects\azure-webjobs-sdk-rqm4t\src\Microsoft.Azure.WebJobs.Host\Executors\FunctionExecutor.cs:line 278
--- End of inner exception stack trace ---
at Microsoft.Azure.WebJobs.ServiceBus.MessageProcessor.CompleteProcessingMessageAsync(Message message, FunctionResult result, CancellationToken cancellationToken)
at Microsoft.Azure.WebJobs.ServiceBus.Listeners.ServiceBusListener.ProcessMessageAsync(Message message, CancellationToken cancellationToken)
at Microsoft.Azure.ServiceBus.MessageReceivePump.MessageDispatchTask(Message message)```
使用带有最新开发包(将作为 6.1 发布)的 Azure Functions 时,故障消息将不会移动到 _error 队列,而是抛出异常,以便 Azure 可以将该消息移至死信队列。在 6.0.1 中有一个问题,在 6.0.2 中有一个后续问题(与 IDeadLetterTransport 相关)。
尝试最新的软件包 (-develop),如果问题解决了请告诉我。否则,那里可能还隐藏着另一个错误。