我希望编写一个Azure函数,它接收来自IoTHub的消息,并根据消息中的数据将其放在Service总线队列中。问题是,队列名称将根据消息的参数和我查看的文档进行更改,例如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:无法将参数'queue'绑定到type 串放;.确保绑定支持参数Type。
答案 0 :(得分:2)
您可以定义一个类来强烈输入您的消息:
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"
}
答案 1 :(得分:1)
另一种方法是使用{IntT Hub的custom endpoints and message routing并直接将消息从IoT Hub发送到您选择的SB队列,而不通过函数。
目前IoT Hub路由仅适用于消息属性,尚未在消息体上(在记录计划中),但您可以将队列名称放在消息属性中,只需定义查询以将消息路由到基于此属性的正确队列。 存在一些限制,例如您可以为IoT Hub设置的自定义端点的数量以及预定义队列应该是什么,但取决于您可能适合您的方案。