【问题标题】:Azure Function QueueTrigger and int messageAzure 函数 QueueTrigger 和 int 消息
【发布时间】:2021-05-22 20:46:08
【问题描述】:

我想将 int 值保存到队列消息中,然后在 Azure Function QueueTrigger 上获取它。

我通过以下方式保存:

        int deviceId = -1;
        await queue.AddMessageAsync(new CloudQueueMessage(deviceId.ToString()));

然后监听队列:

    public async Task Run(
        [QueueTrigger("verizon-suspend-device", Connection = "StorageConnectionString")] string queueMessage, 
        ILogger log)
    {
        int deviceId = int.Parse(queueMessage);

但所有消息都被移动到verizon-suspend-device-poison 队列。怎么了?

【问题讨论】:

  • 很多事情都可能出错。如果 3 次重试失败,消息就会中毒(默认为 3 次)。您需要阅读/发布这 3 次执行期间发生的异常/错误消息。另外 1) 删除 int.Parse(queueMessage) 并添加一个日志,看看你进入函数的内容/如果有什么。 2) 将 Function 的整个代码放入 try-catch 并打印异常。查找异常/错误(尤其是代码之外的错误)的最佳位置是 Portal->Functions->your-function->Monitor
  • 它根本没有记录,即使我尝试记录queueMessage

标签: c# azure-functions message-queue azure-queues queuetrigger


【解决方案1】:

Azure Function Queue Triggers currently require Base64-encoded messages 是一个不幸的限制。如果您针对存储模拟器运行代码,您应该会从触发器中看到一个异常,例如 The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

至少目前(即,在触发器可以处理二进制/utf8 消息之前),排队代码必须将消息作为 Base64 字符串放在队列中。 string 消息的队列触发代码以 hereAsString assumes a Base64 encoding 结尾。

对于那个(old) version of the storage SDK,你可以发送一个Base64编码的UTF-8字符串表示的整数:

var bytes = Encoding.UTF8.GetBytes(deviceId.ToString());
await queue.AddMessageAsync(new CloudQueueMessage(Convert.ToBase64String(bytes), isBase64Encoded: true));

使用new storage SDK,您可以通过set MessageEncoding on your QueueClient to QueueMessageEncoding.Base64 发送整数的字符串表示形式(新的存储SDK 将为您进行UTF-8 编码然后Base64 编码)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-09
    • 1970-01-01
    • 2021-02-10
    • 2018-12-15
    • 1970-01-01
    • 2021-05-15
    • 2017-11-30
    • 2014-12-12
    相关资源
    最近更新 更多