【问题标题】:How to bind to MessageSender in an Azure function?如何在 Azure 函数中绑定到 MessageSender?
【发布时间】:2019-06-22 23:50:58
【问题描述】:

我正在使用服务总线队列和 Azure 函数。根据某些业务逻辑,失败的处理方式不同。有些消息需要发送到死信队列,有些消息需要修改然后显式添加回队列。

考虑以下代码:

[FunctionName("ServiceBusTask")]
public static async Task Run(
    [ServiceBusTrigger("myQueue", Connection = "myConnectionString")]
    Message message, 
    MessageReceiver messageReceiver, 
    //MessageSender messageSender, 
    ILogger log)
{
    //some business logic that can fail

    if( condition for dead letter)
    {
        await messageReceiver.DeadLetterAsync(message.SystemProperties.LockToken);
    }
    else if( condition for a manual retry)
    {
        QueueClient qc = new Queueclient("myQueue", "myConnectionString");
        Message updatedMessage = GetUpdatedMessage(message);
        await qc.SendAsync(updatedMessage);
        //await messageSender.SendAsync(updatedMessage);
    }
}

messageReceiver 可以很好地向死信队列发送消息,但我需要创建一个 QueueClient 来将消息发送到队列,这让我很困扰。知道MessageSender 存在,我尝试将其添加到参数中,但我收到一条错误消息:

无法将参数“messageSender”绑定到类型 MessageSender。确保绑定支持参数类型。如果您正在使用绑定扩展(例如 Azure 存储、ServiceBus、计时器等),请确保您已在启动代码中调用了扩展的注册方法(例如 builder.AddAzureStorage()、builder.AddServiceBus( )、builder.AddTimers() 等)。

我不太清楚为什么它告诉我启动代码,我没有这样的东西,所以我猜错误消息没有更新......

阅读this issue on the Azure webjobs SDK,我觉得应该支持它(如果我读错了,请纠正我!)。

我的问题

是否可以像这样使用MessageSender,如果可以,我需要做什么才能使其工作?

【问题讨论】:

    标签: c# .net-core azure-functions azureservicebus azure-servicebus-queues


    【解决方案1】:

    您的函数正在使用 ServiceBusTrigger,它支持 MessageReceiver,但不支持 MessageSender 绑定 - ServiceBus 输出绑定支持该绑定,您可以将其添加到函数中。 (example)

    【讨论】:

    • 这行得通,尽管它似乎有一种奇怪的行为,即向同一个队列发送消息似乎不会让 Azure 将当前消息标记为已完成。不过,这可能只是我的逻辑问题。
    • 我们如何设置messagesender的属性?
    猜你喜欢
    • 2018-04-07
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2021-05-07
    • 2021-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多