Azure 函数根据消息数据将消息路由到队列名称
Azure function to route message to queue namebased on message data
我想编写一个 Azure 函数,该函数从 IoTHub 接收消息并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称会根据消息的参数和我看过的文档进行更改,例如 this 都将队列名称设置为输出设置的一部分。
有没有人做过类似的事情或有任何代码示例根据传入消息中的值写入队列?我正在尝试设置一个函数,但它甚至不允许我将输出类型设置为服务总线并且不将队列名称放入其中,我不能这样做,因为它不是固定的!
所以如果输入是:
{
“queue”: “MyQ12345”,
“data”: “some data here”
}
该函数应将数据字段(或整个传入消息)写入已存在于同一 subscription/resource 组等中的服务总线队列“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: Cannot bind parameter 'queue' to type
String&. Make sure the parameter Type is supported by the binding.
您可以定义一个 class 来使您的消息具有强类型:
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"
}
另一种方法是对 Azure IoT 中心使用 custom endpoints and message routing,并直接将消息从 IoT 中心发送到您选择的 SB 队列,而不通过函数。
目前 IoT 中心路由仅适用于消息属性,还不适用于消息正文(在记录计划中),但您可以将队列名称放在消息中 属性 并简单地定义一个查询以根据此 属性 将消息路由到正确的队列。
存在一些限制,例如您可以为 IoT 中心设置的自定义终结点的数量以及预定义的队列应该是什么,但这取决于您的场景是否适合您。
我想编写一个 Azure 函数,该函数从 IoTHub 接收消息并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称会根据消息的参数和我看过的文档进行更改,例如 this 都将队列名称设置为输出设置的一部分。 有没有人做过类似的事情或有任何代码示例根据传入消息中的值写入队列?我正在尝试设置一个函数,但它甚至不允许我将输出类型设置为服务总线并且不将队列名称放入其中,我不能这样做,因为它不是固定的!
所以如果输入是:
{
“queue”: “MyQ12345”,
“data”: “some data here”
}
该函数应将数据字段(或整个传入消息)写入已存在于同一 subscription/resource 组等中的服务总线队列“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: Cannot bind parameter 'queue' to type String&. Make sure the parameter Type is supported by the binding.
您可以定义一个 class 来使您的消息具有强类型:
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"
}
另一种方法是对 Azure IoT 中心使用 custom endpoints and message routing,并直接将消息从 IoT 中心发送到您选择的 SB 队列,而不通过函数。
目前 IoT 中心路由仅适用于消息属性,还不适用于消息正文(在记录计划中),但您可以将队列名称放在消息中 属性 并简单地定义一个查询以根据此 属性 将消息路由到正确的队列。 存在一些限制,例如您可以为 IoT 中心设置的自定义终结点的数量以及预定义的队列应该是什么,但这取决于您的场景是否适合您。