Masstransit未为Azure函数事件订阅服务器创建错误队列

Masstransit未为Azure函数事件订阅服务器创建错误队列,azure,azure-functions,azureservicebus,masstransit,azure-servicebus-topics,Azure,Azure Functions,Azureservicebus,Masstransit,Azure Servicebus Topics,我们遵循这个示例()尝试使用MassTransit(对于.NETCore2.1,Azure函数2.0)将Azure函数设置为Azure服务总线事件(主题)订户 使用Azure Webjobs时,这与使用RabbitMQ一样简单,配置发布服务器,让订阅者配置和设置其队列,并让Masstransit自动为每个事件创建一个主题,在所有重试失败后重定向到队列和“队列错误”。您不必手动设置任何内容 但是对于Azure功能,我们似乎需要手动(通过服务总线浏览器或ARM模板)将订阅者添加到主题(由发布者在发布

我们遵循这个示例()尝试使用MassTransit(对于.NETCore2.1,Azure函数2.0)将Azure函数设置为Azure服务总线事件(主题)订户

使用Azure Webjobs时,这与使用RabbitMQ一样简单,配置发布服务器,让订阅者配置和设置其队列,并让Masstransit自动为每个事件创建一个主题,在所有重试失败后重定向到队列和“队列错误”。您不必手动设置任何内容

但是对于Azure功能,我们似乎需要手动(通过服务总线浏览器或ARM模板)将订阅者添加到主题(由发布者在发布第一个事件时创建)以及队列中(虽然这些似乎都不是必需的,但这些事件是由使用Azure函数主题的订阅者直接处理的。)

也许我们做错了什么,我从文档中看不出MT不会像通常那样在使用Azure功能时设置订阅者和创建队列。但是它可以工作,除非消费者抛出异常并且在执行所有设置重试之后。我们只是没有在死信队列和通常,甚至不会生成MT生成的错误队列

那么,我们如何让MT创建错误队列,并将失败事件移动到那里呢

我们的守则:

    [FunctionName("OrderShippedConsumer")]
    public static Task OrderShippedConsumer(
        [ServiceBusTrigger("xyz.events.order/iordershipped", "ordershippedconsumer-queue", Connection = "AzureServiceBus")] Message message, 
        IBinder binder,
        ILogger logger,
        CancellationToken cancellationToken,
        ExecutionContext context)
    {
        var config = CreateConfig(context);

        var handler = Bus.Factory.CreateBrokeredMessageReceiver(binder, cfg =>
        {
            var serviceBusEndpoint = Parse.ConnectionString(config["AzureServiceBus"])["Endpoint"];
            cfg.CancellationToken = cancellationToken;
            cfg.SetLog(logger);
            cfg.InputAddress = new Uri($"{serviceBusEndpoint}{QueueName}");

            cfg.UseRetry(x => x.Intervals(TimeSpan.FromSeconds(5)));
            cfg.Consumer(() => new OrderShippedConsumer(cfg.Log, config));
        });
        return handler.Handle(message);
    }

以及消费者守则:

    public OrderShippedConsumer(ILog log, IConfigurationRoot config)
    {
        this.config = config;
        this.log = log;
    }

    public async Task Consume(ConsumeContext<IOrderShipped> context)
    {
       // Handle the event
    }
}
public OrderShippedConsumer(ILog日志,IConfigurationRoot配置)
{
this.config=config;
this.log=log;
}
公共异步任务使用(使用上下文)
{
//处理事件
}
}

对于Azure函数,没有MT cat为您设置的订阅,这是您创建函数时要做的。此外,错误处理由函数引擎根据完成。函数有自己的毒药队列。谢谢,有趣的文章!我知道Azure函数的内置重试,但实际上没有就连这个“行动中”由于重试似乎是由MT处理的,因此在使用者中配置的重试策略就是正在使用的策略:根据上面的代码,5秒后重试一次。除此之外没有其他内容。此外,在所有重试都失败后,我们也不会创建有毒队列。除了从使用者中抛出异常之外,我们还需要做其他事情吗hod?Alexey是对的,函数有自己的错误处理,MT只是让您通过收集器消费和发布/发送其他消息。谢谢。因此,基本上我们不需要通过MT配置重试,而只需使用内置重试,并在失败后将事件移动到中毒队列(默认)5次重试?无论如何,目前我们根本没有收到毒药队列,消息在MT配置的重试后消失(5秒后一次)。我怀疑我们可能必须在门户上手动启用Service Bus主题触发器扩展才能正常工作,如下所述:(尝试时门户中出现错误)我面临着完全相同的问题。消息既不会进入死信队列,也不会进入错误/中毒队列。您找到解决方案了吗?