有一个在Edge IoT设备上运行的publisher
和consumer
自定义模块。无论publisher
模块处理与否,consumer
模块都会以恒定速率生成消息。 consumer
模块将消息POST到外部服务,并且假设没有Internet连接,consumer
模块想要重新排列消息,以免丢失并再次尝试。
我不喜欢写一个无限循环来继续重试;此外,如果重新启动模块,则消息将丢失。所以我更喜欢将消息重新排队到edgeHub / RocksDB。
在哪里可以找到可以为IoTHubMessageDispositionResult提供的可用响应的文档?如果需要重新发送消息,发送的响应是什么?
if message.processed():
return IoTHubMessageDispositionResult.ACCEPTED
else:
return IoTHubMessageDispositionResult.??
您不必实现自己的消息重排。 IotEdge提供了离线功能,如本blog post和此documentation page中所述。
如果没有与IotHub的连接,edgeHub将在edgeDevice上本地存储消息。一旦再次建立连接,它将自动开始发送这些消息(按正确的顺序)。
您可以配置edgeHub缓冲消息的时间长度如下:
"$edgeHub": {
"properties.desired": {
"schemaVersion": "1.0",
"routes": {},
"storeAndForwardConfiguration": {
"timeToLiveSecs": 7200
}
}
}
如果您不配置任何内容,7200秒(2小时)也是默认值。
默认情况下,消息将写入edgeHub docker容器中的文件夹。如果您想将它们存储在其他地方,可以使用以下配置:
"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"
}
将HostStoragePath和ModuleStoragePath替换为所需的值。例:
"createOptions": {
"HostConfig": {
"Binds": [
"/etc/iotedge/storage/:/iotedge/storage/"
],
...
}
}
},
"env": {
"storageFolder": {
"value": "/iotedge/storage/"
},
...
请注意,您可能必须手动授予iotEdge用户(或所有用户)访问该文件夹的权限(使用chmod)。
更新:
如果您只是在寻找IoTHubMessageDispositionResult的可用值,您将找到答案here:
class IoTHubMessageDispositionResult(Enum):
ACCEPTED = 0
REJECTED = 1
ABANDONED = 2
更新2:
已接受消息的消息将从消息队列中删除,因为它们已成功传递。
将ABANDONED消息再次添加到消息队列中,模块将尝试按retryPolicy中的定义再次发送消息。有关retryPolicy的更多信息,您可以阅读此thread。
REJECTED消息不会再次添加到消息队列中。