QueueTrigger Azure 函数不处理消息并表现出奇怪的行为

问题描述 投票:0回答:1

我正在 azure 应用程序服务上的 Web 作业中实现队列消息处理程序。但我在处理程序应用程序中遇到了一些非常奇怪的行为。这个过程非常简单 - 我有一个触发器应用程序,它创建一条消息并将该消息发送到队列。然后,我将侦听器/处理程序应用程序放在单独的应用程序服务中,该服务从队列中获取消息并对其进行处理。下面是这两个应用程序的两个非常小的代码片段。

//TRIGGER APP
QueueClient queue = new QueueClient(storageConnectionString, queueName);
queue.CreateIfNotExists();
queue.SendMessage(JsonConvert.SerializeObject(myModel));


//HANDLER APP
public class Functions
{
    IConfiguration configuration;
    private static List<CosmosClient> cosmosClients = new List<CosmosClient>();
    public Functions(IConfiguration _configuration)
    {
        configuration = _configuration;
    }
    public void ProcessQueueMessageAsync([QueueTrigger("%QueueName%")] string message)
    {
        Console.WriteLine(message);
        // do more stuff here...
    }
}

奇怪的行为是我的“处理程序应用程序”立即将消息放入有害队列中。我在任何地方都找不到错误日志。我已经实时搜索了控制台日志、应用程序服务日志、甚至日志流,并且没有任何错误记录。但所有消息都被放入有害队列中。在代码到达处理程序中的第一行之前,它们就被放置在中毒队列中(

Console.WriteLine(message);
)更奇怪的是,我可以进入中毒队列,找到中毒的消息,然后手动复制和复制将“中毒”消息粘贴回 Azure 门户(而不是代码中)的常规队列(与上面代码中的队列相同)。使用门户手动将其添加回队列后,会点击
Console.WriteLine(message);
,记录消息,并顺利浏览应用程序的其余部分。我对此感到困惑。

我也实时观看了这个。我看到消息被放入常规队列中。我检查了一下,看起来不错。几秒钟后,它消失并出现在毒药队列中。我检查了一下,看起来一模一样。我从有害队列复制该队列消息,然后将“添加消息”返回到常规队列,然后简单地粘贴有害队列上的内容。然后它会得到很好的处理(不会返回到有毒队列)。我还有其他日志记录机制来验证它在“粘贴”回来后是否成功处理。

我是否在代码中以错误的方式将消息添加到队列(上面的触发应用程序)?我在这里缺少什么?

c# azure-web-app-service message-queue azure-queues azure-storage-queues
1个回答
0
投票

虽然我找到了这个问题的解决方案,但我仍然不知道为什么会发生这种情况。解决方案是在触发器中使用不同的队列客户端。当消息添加到队列时,两个客户端之间一定存在某种编码差异(无论如何,这是我最好的猜测)。解决方案是改变这个:

//TRIGGER APP
QueueClient queue = new QueueClient(storageConnectionString, queueName);
queue.CreateIfNotExists();
queue.SendMessage(JsonConvert.SerializeObject(myModel));

对此:

//TRIGGER APP
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageConnectionString);
CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
CloudQueue queue = queueClient.GetQueueReference(queueName);
queue.CreateIfNotExistsAsync().Wait();
queue.AddMessageAsync(new CloudQueueMessage(JsonConvert.SerializeObject(myModel))).Wait();
© www.soinside.com 2019 - 2024. All rights reserved.