Azure IoT 中心中的消息路由只会导致孤立消息
Message routing in Azure IoT hub only results in orphaned messages
我正在为设备编写心跳函数。以下代码使用适用于设备的 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 中心查看指标时,它显示零消息被路由到事件中心并且发送的所有消息都是 "orphaned"。
在内置端点下,我还添加了一个名为 heartbeats
的额外消费者组。
我已经尝试激活回退路由,然后使用来自 Python SDK 的修改后的示例,它只接收消息,我连接到 IoT Hub 事件中心,我可以在那里找到消息,但我可以' 让路由工作。我还看到指标中的孤立消息 return 变为 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;
}
尽管进行了上述修复,正文路由似乎仍无法正常工作
以下是修复:
- 类型 = 'heartbeat'
- 为 utf-8 设置消息 ContentEcoding
查看更多详情here。
我正在为设备编写心跳函数。以下代码使用适用于设备的 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 中心查看指标时,它显示零消息被路由到事件中心并且发送的所有消息都是 "orphaned"。
在内置端点下,我还添加了一个名为 heartbeats
的额外消费者组。
我已经尝试激活回退路由,然后使用来自 Python SDK 的修改后的示例,它只接收消息,我连接到 IoT Hub 事件中心,我可以在那里找到消息,但我可以' 让路由工作。我还看到指标中的孤立消息 return 变为 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;
}
尽管进行了上述修复,正文路由似乎仍无法正常工作
以下是修复:
- 类型 = 'heartbeat'
- 为 utf-8 设置消息 ContentEcoding
查看更多详情here。