当前位置: 首页 > 知识库问答 >
问题:

Azure函数根据消息数据将消息路由到队列名称

林鹏鹍
2023-03-14

我希望编写一个Azure函数,该函数接收来自IoTHub的消息,并根据消息中的数据将其放置在服务总线队列中。问题是,队列名称将根据我所查看的消息和留档的参数进行更改,例如,将队列名称设置为输出设置的一部分。有人做过类似的事情吗?或者有任何代码示例可以根据传入消息中的值写入队列?我试图设置一个函数,但它甚至不让我设置输出类型为服务总线,而不把队列名称,我不能,因为它是不固定的!

所以如果输入是:

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

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

编辑1:以下是我到目前为止得到的:

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

跑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; }
}

作用json:

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

但这给了我以下错误:

微软蔚蓝色的WebJobs。主机:无法将参数“队列”绑定到类型字符串

共有2个答案

麻烨
2023-03-14

另一种方法是使用Azure IoT Hub的自定义endpoint和消息路由,直接将消息从IoT Hub发送到您选择的SB队列,而无需通过函数。

目前,IoT集线器路由仅适用于消息属性,还不适用于消息正文(在记录计划中),但您可以将队列名称放入消息属性中,然后简单地定义一个查询,根据此属性将消息路由到正确的队列。存在一些限制,例如您可以为IoT Hub设置自定义endpoint的数量,以及预定义队列应该是什么,但这取决于您的场景。

周学义
2023-03-14

您可以定义一个类以使邮件具有强类型:

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"
}
 类似资料:
  • 我正在考虑将Socket.io集成到一个express应用程序中。 js有一个非常好的特性,可以通过socket.io消息调用快速路由。 不过,帆在其他方面比我需要的要多一点。我正在寻找一种方法,使socket.io请求转发到快速路由,而不必使用整个sails框架。我想这是一个很常见的需求,所以我很惊讶我没有找到一个npm模块来做这件事,但是找了很长时间,我什么也没有找到。Express.io会这

  • 问题内容: 我有一个Java App和一个NodeJS App,它们都使用一个Azure Service Bus消息队列。 我看到与客户产生一些奇怪的影响,如下所示。 JAVA MESSAGE PRODUCER(每个Azure JMS教程使用QPID库): 输出:发送的邮件的JMSMessageID = ID:2414932965987073843 NODEJS消息消费者: 输出: 如果将其与通过

  • 为什么已经拥有了共享内存时需要消息队列呢? 这将是多种原因,让我们将其分解为多个点来简化 - 据了解,一旦消息被一个进程接收到,它将不再可用于任何其他进程。 而在共享内存中,数据可供多个进程访问。 如果想使用小信息格式进行通信。 当多个进程同时进行通信时,共享内存数据需要同步保护。 使用共享内存的写入和读取频率很高,那么实现功能将会非常复杂。 在这种情况下不值得使用。 如果所有的进程不需要访问共享

  • 一、消息模型 点对点 发布/订阅 二、使用场景 异步处理 流量削锋 应用解耦 三、可靠性 发送端的可靠性 接收端的可靠性 参考资料 一、消息模型 点对点 消息生产者向消息队列中发送了一个消息之后,只能被一个消费者消费一次。 发布/订阅 消息生产者向频道发送一个消息之后,多个消费者可以从该频道订阅到这条消息并消费。 发布与订阅模式和观察者模式有以下不同: 观察者模式中,观察者和主题都知道对方的存在;

  • 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 一个线程会从消息队列中收取消息,另一个线程会定时给消息队列发送普通消息和紧急消息 源码/* * Copyright (c) 2006-2018, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: *

  • 消息队列接口 结构体 struct   rt_messagequeue   消息队列控制块 更多...   类型定义 typedef struct rt_messagequeue *  rt_mq_t   消息队列类型指针定义   函数 rt_err_t  rt_mq_init (rt_mq_t mq, const char *name, void *msgpool, rt_size_t msg_