【问题标题】:Azure function to route message to queue namebased on message dataAzure 函数根据消息数据将消息路由到队列名称
【发布时间】:2017-10-01 03:33:10
【问题描述】:

我希望编写一个 Azure 函数,该函数从 IoTHub 接收消息并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称将根据消息的参数和我查看的文档而更改,例如this 都将队列名称设置为输出设置的一部分。 有没有人做过类似的事情或有任何代码示例根据传入消息中的值写入队列?我正在尝试设置一个功能,但它甚至不允许我将输出类型设置为服务总线,也不允许将队列名称放入,我不能,因为它不是固定的!

所以如果输入是:

{
    “queue”: “MyQ12345”,
    “data”: “some data here”
}

该函数应该将数据字段(或整个传入消息)写入服务总线队列“MyQ12345”,该队列已存在于同一订阅/资源组等中。 谢谢

EDIT1:这是我到目前为止所得到的:

所以我尝试了@Mikhail 的建议,这就是我正在做的:

run.csx

using System;

public static string Run(MyPoco myEventHubMessage, TraceWriter log, out string queue)
{
    var queueName = myEventHubMessage.QueueName;
    queue = queueName;
    log.Info($"<IoT Hub => ServiceBus> C# Event Hub trigger function processed a message: {queueName}");
    return QueueName;
}

public class MyPoco
{
  public string QueueName { get; set; }
  public double Other { get; set; }
  public double Props { get; set; }
  public int Here { get; set; }
}

function.json

{
      "type": "serviceBus",
      "name": "$return",
      "direction": "out",
      "queueName": "{queue}",
      "connection": "ServiceBusConnectionString",
      "accessRights": "manage"
}

但这给了我以下错误:

Microsoft.Azure.WebJobs.Host:无法将参数“队列”绑定到类型 细绳&。确保绑定支持参数类型。

【问题讨论】:

    标签: azure azure-functions azure-iot-hub azure-servicebus-queues


    【解决方案1】:

    您可以定义一个类来使您的消息具有强类型:

    public class MyItem
    {
        public string Queue { get; set; }
        public string Data { get; set; }
    }
    

    然后接受它作为函数输入参数:

    public string Run(MyItem item)
    {
        return item.Data;
    }
    

    并像这样定义输出绑定:

    {
        "type": "serviceBus",
        "name": "$return",
        "queueName": "{queue}",
        "connection": "...",
        "accessRights_": "Manage",
        "direction": "out"
    }
    

    【讨论】:

    • 我得到:... 2017-05-04T09:07:48.239 执行函数时出现异常:Functions.cs_IotHubToServiceBusQueue。 Microsoft.Azure.WebJobs.Host:异常绑定参数“_return”。 Microsoft.ServiceBus:无法直接在子队列上创建客户端。在主队列上创建一个客户端,并使用它在适当的子队列上创建接收者。
    • @LDJ 查看您的 EDIT1:{queue} 绑定应该与您输入消息中的字段匹配,因此您的 POCO 应该是 {queueName}。 C# 函数中不需要out 参数。返回值应该是消息内容(现在您将发送队列名称作为消息正文)。
    • 成功了。非常感谢您对此提供的帮助。我发现 Azure Functions 的语法非常不直观!
    【解决方案2】:

    另一种方法是为 Azure IoT Hub 使用 custom endpoints and message routing,并直接将消息从 IoT Hub 发送到您选择的 SB 队列,而无需通过函数。

    目前,IoT 中心路由仅适用于消息属性,尚不适用于消息正文(在记录计划中),但您可以将队列名称放在消息属性中,然后简单地定义一个查询以将消息路由到基于此属性的正确队列。 有一些限制,例如您可以为 IoT 中心设置的自定义端点的数量以及预定义队列应该是什么,但这取决于您可能适合您的方案。

    【讨论】:

    • 感谢@OlivierBloch。但是我将如何设置它以从消息中获取队列名称?我无法设置端点,因为在从 IoTHub 检索消息之前我不知道它,因此无法指定队列。设置路由时,它会询问端点名称...
    • 你是对的,这至少不能简单地动态完成。这是我在回复中的最后一条评论,根据您的具体情况,这可能不是理想的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2021-05-31
    • 2022-11-04
    • 2014-09-17
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多