0

即时消息寻找编写一个Azure函数,该函数从IoTHub接收消息并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称将根据消息的参数以及我查看的文档(如this)的参数进行更改,所有这些都将队列名称设置为输出设置的一部分。 有没有人根据传入消息中的值做了类似的事情或者有任何代码样本写入队列?我试图设置一个函数,但它甚至不会让我将输出类型设置为服务总线,并且不会将队列名称放入,我不能这样做,因为它不是固定的!Azure函数根据消息数据将消息路由到队列名称

因此,如果输入是:

{ 
    “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: Cannot bind parameter 'queue' to type String&. Make sure the parameter Type is supported by the binding.

回答

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" 
} 
+0

我得到:... 2017-05-04T09:07:48.239执行函数时发生异常:Functions.cs_IotHubToServiceBusQueue。 Microsoft.Azure.WebJobs.Host:异常绑定参数'_return'。 Microsoft.ServiceBus:无法直接在子队列上创建客户端。在主队列上创建一个客户端,并使用它在适当的子队列上创建接收者。 – LDJ

+0

@LDJ看看你的EDIT1:'{queue}'绑定应该与你的输入消息中的字段匹配,所以它应该是你的POCO的'{queueName}'。在C#函数中不需要'out'参数。并且返回值应该是消息内容(现在您将发送队列名称作为消息体)。 – Mikhail

+0

它的工作。非常感谢您对这一次的帮助。我发现Azure函数的语法非常不直观! – LDJ

1

另一种方法是使用custom endpoints and message routing为天青物联网枢纽和直接将消息从IoT Hub发送到您选择的SB队列,而不通过功能。

目前物联网集线器路由仅适用于消息属性,尚未位于消息正文(位于记录计划中),但您可以将该队列名称放入消息属性中,并且只需定义一个查询来路由消息根据这个属性到正确的队列。 有一些限制,例如可以为物联网集线器设置的自定义终端数量以及预定义队列应该是什么,但取决于您可以为您工作的场景。

+0

谢谢@OlivierBloch。但是,我将如何设置它以从消息中获取队列名称?我无法设置端点,因为直到从IoTHub检索消息才知道它,因此无法指定队列。在建立路由时,它会要求输入端点名称... – LDJ

+0

你是对的,这不能做到动态的,至少不是简单的。这是我在回复中的最后一条评论,具体取决于您的具体情况,这可能不是理想的解决方案。 –