Edge IoT设备上正在运行publisher
和consumer
自定义模块。无论publisher
模块是否处理消息,consumer
模块始终以恒定的速率生成消息。 consumer
模块将消息发布到外部服务,并且由于没有Internet连接,因此consumer
模块希望重新排列消息,以免丢失并再次尝试。
我不想编写无限循环来保持重试;同样,如果模块重新启动,该消息也会丢失。所以我更喜欢将消息重新排队到edgeHub / RocksDB。
在哪里可以找到有关可以为IoTHubMessageDispositionResult提供的可用响应的文档?如果需要重新排队消息,发送的响应是什么?
if message.processed():
return IoTHubMessageDispositionResult.ACCEPTED
else:
return IoTHubMessageDispositionResult.??
答案 0 :(得分:1)
您不必实现自己的消息重新排队。 IotEdge提供了此blog post和此documentation page中所述的离线功能。
如果没有与IotHub的连接,edgeHub将在本地将消息存储在edgeDevice上。重新建立连接后,它将自动开始以正确的顺序发送这些消息。
您可以配置edgeHub将这样的消息缓冲多长时间:
some_sub(\@myarray);
如果您未进行任何配置,则默认设置为7200秒(2小时)。
默认情况下,消息将被写入edgeHub docker容器内的文件夹中。如果要将它们存储在其他位置,则可以使用以下配置:
"$edgeHub": {
"properties.desired": {
"schemaVersion": "1.0",
"routes": {},
"storeAndForwardConfiguration": {
"timeToLiveSecs": 7200
}
}
}
用所需的值替换 HostStoragePath 和 ModuleStoragePath 。示例:
"edgeHub": {
"type": "docker",
"settings": {
"image": "mcr.microsoft.com/azureiotedge-hub:1.0",
"createOptions": {
"HostConfig": {
"Binds": ["<HostStoragePath>:<ModuleStoragePath>"],
"PortBindings": {
"8883/tcp": [{"HostPort":"8883"}],
"443/tcp": [{"HostPort":"443"}],
"5671/tcp": [{"HostPort":"5671"}]
}
}
}
},
"env": {
"storageFolder": {
"value": "<ModuleStoragePath>"
}
},
"status": "running",
"restartPolicy": "always"
}
请注意,您可能必须手动授予iotEdge用户(或所有用户)对该文件夹的访问权限(使用chmod)。
更新:
如果您只是在寻找 IoTHubMessageDispositionResult 的可用值,则会找到答案here:
"createOptions": {
"HostConfig": {
"Binds": [
"/etc/iotedge/storage/:/iotedge/storage/"
],
...
}
}
},
"env": {
"storageFolder": {
"value": "/iotedge/storage/"
},
...
更新2:
已已接受的邮件已从邮件队列中删除,因为它们已成功传递。
已被已取消的消息再次添加到消息队列中,模块将尝试按照retryPolicy中的定义再次发送。有关retryPolicy的更多信息,您可以阅读此thread。
拒绝的邮件不会再次添加到邮件队列中。