Azure存储队列和消息形状

时间:2018-11-15 17:05:04

标签: azure azure-storage azure-functions azure-storage-queues

我已经环顾四周并进行搜索,但是找不到任何可以解决此问题的方法,因此,如果我的Google Fu无法使我成功,请指向正确的方向。

我们正在使用Azure存储队列来触发执行Azure功能(V2)。 (我不认为这种用法是有意义的,但是为了以防万一,我将其包括在内。)在开发Function的过程中,输入数据的“形状”发生了变化(我正在使用C#POCO对象并进行序列化它们转换为JSON来创建队列消息内容。)

我发现的是,在将代码更改推送到Azure之后,存储队列将继续以旧对象JSON格式将JSON消息发送到功能 -即使提供了JSON存储队列为新格式。

修复非常简单-删除队列,然后让代码重新创建它。但是,这里有很多困惑:

  1. Azure存储队列将消息作为字符串值,那么为什么要附加“ schema”呢?我意识到该消息最终是在CloudQueueMessage对象中提供的,因此在幕后可能会发生某种JSON优点。但是...
  2. 如果有一个(肯定是一个),为什么存储队列会接受并成功处理与该格式不匹配的消息?如果有的话,我希望该消息最终出现在中毒队列中,而不是尝试将传入消息“转换”为架构。
  3. 是否有一种方法可以处理此“代码中的代码”(除了编写自己的代码以“检查模式”之外)?
  4. 如果我提供一个简单的字符串值会发生什么? (对我而言,这真的比其他任何东西都更具好奇心...)

任何人都能提供/指向我的答案将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可能将CloudQueueMessage对象的消息内容弄错了。

我们通常在代码中处理的是消息内容/文本/正文,其中包含我们要处理的信息。在您的情况下,即C#POCO和序列化的Json有效负载。

当我们在Azure存储队列中创建队列消息时,Azure将填充几个属性。 CloudQueueMessage对象由消息内容和这些属性组成。它们用于控制队列消息在我们处理其内容时的行为,请检查the doc的用法。

    public static long MaxMessageSize { get; }
    public static TimeSpan MaxVisibilityTimeout { get; }
    public static int MaxNumberOfMessagesToPeek { get; }
    public string Id { get; }
    public string PopReceipt { get; }
    public DateTimeOffset? InsertionTime { get; }
    public DateTimeOffset? ExpirationTime { get; }
    public DateTimeOffset? NextVisibleTime { get; }
    public int DequeueCount { get; }

对于消息内容本身,它可以是字符串或字节数组。当Azure Function收到消息时,我们将several options填充队列消息的方式,前三个仅接收消息内容。

  • 对象-Functions运行时将JSON有效负载反序列化为代码中定义的任意类的实例。
  • 字符串
  • byte []
  • CloudQueueMessage