azure - Azure IoT 中心中的消息路由只会导致孤立消息
问题描述
我正在为设备编写心跳功能。以下代码使用适用于设备的 Azure SDK 构造消息信封:
private Message constructHeartbeatEnvelope(final HeartbeatEvent heartbeat) throws JsonProcessingException {
String jsonString = mapper.writeValueAsString(heartbeat);
System.out.println(jsonString);
final Message message = new Message(jsonString.getBytes(StandardCharsets.UTF_8));
message.setProperty("type", "heartbeat");
message.setContentTypeFinal("application/json");
message.setExpiryTime(HEARTBEAT_INTERVAL);
return message;
}
在此设备所属的 IoT Hub 中,我有以下两条路由用于测试目的:
+-----------------+----------------+--------------------------------------+------------+---------+
| Name | Data Source | Routing Query | Endpoint | Enabled |
+-----------------+----------------+--------------------------------------+------------+---------+
| heartbeat-route | DeviceMessages | $body.type.name = 'heartbeat/device' | events-dev | true |
| events-dev-type | DeviceMessages | $type = 'heartbeat' | events-dev | true |
+-----------------+----------------+--------------------------------------+------------+---------+
邮件正文如下所示:
{
"created": 1568104629007,
"type": {
"name": "heartbeat/device",
"version": "1.0"
},
"origin": "iothubdeviceid",
"content": {
// heartbeat metadata
},
"originId": "S1"
}
回退路由被禁用。
端点是一个事件中心,events-dev
它有一个专门的消费者组来处理这些心跳事件。最后一个是函数应用程序,它从这个事件中心消费,并且只打印它接收到的内容的主体以用于调试目的。
但是,当我在 IoT 中心查看指标时,它显示零消息被路由到事件中心,并且所有发送的消息都是“孤立的”。
在内置端点下,我还添加了一个名为heartbeats
.
我尝试激活回退路由,然后使用仅接收消息的 Python SDK 中的修改示例,我连接到 IoT 中心事件中心,我可以在那里找到消息,但我根本无法让路由工作。我还看到指标中的孤立消息返回到 0,并且路由到回退的消息上升。heartbeats
执行此方法时,我也没有收到有关消费者组的任何消息,仅在$Default
.
我在这里做错了什么?
解决方案:
根据下面的回复,以下方法起到了作用:
删除$
以过滤用户添加的属性:
+-----------------+----------------+--------------------------------------+------------+---------+
| Name | Data Source | Routing Query | Endpoint | Enabled |
+-----------------+----------------+--------------------------------------+------------+---------+
| heartbeat-route | DeviceMessages | $body.type.name = 'heartbeat/device' | events-dev | true |
| events-dev-type | DeviceMessages | type = 'heartbeat' | events-dev | true |
+-----------------+----------------+--------------------------------------+------------+---------+
在邮件信封上手动设置内容编码:
private Message constructHeartbeatEnvelope(final HeartbeatEvent heartbeat) throws JsonProcessingException {
String jsonString = mapper.writeValueAsString(heartbeat);
System.out.println(jsonString);
final Message message = new Message(jsonString.getBytes(StandardCharsets.UTF_8));
message.setProperty("type", "heartbeat");
message.setContentTypeFinal("application/json");
message.setContentEncoding("utf-8"); // <---- This line
message.setExpiryTime(HEARTBEAT_INTERVAL);
return message;
}
尽管进行了上述修复,身体路由似乎不起作用
解决方案
推荐阅读
- bash - 将 stdout 和 stderr 重定向到文件,将 stderr 重定向到屏幕,同时保留输出顺序
- c# - 在带有 .NET Core 的库 csproj 中使用 Selenium WebDriver
- proxy - 如何在公司代理后面使用 docker-compose 获得服务间网络?
- amazon-kinesis - software.amazon.kinesis.* 的 jar 在哪里
- r - 将 r 脚本添加到 R 项目并连接到 Github
- linux - 如果变量声明在bash的for循环内,为什么不能更改输入数据
- php - 如何正确关闭查询,使其不与其他查询拦截?
- postgresql - Postgres Docker 启动脚本不起作用
- find - 从目录与另一个目录运行 Find 命令
- c - getline 如何像使用 fgets 一样限制输入量