iotedge: как запросить сообщение, которое не удалось обработать - PullRequest
0 голосов
/ 14 февраля 2019

На устройстве Edge IoT работают пользовательские модули publisher и consumer.Модуль publisher продолжает генерировать сообщения с постоянной скоростью независимо от того, обрабатывает его модуль consumer или нет.Модуль consumer отправляет сообщение во внешнюю службу и, учитывая отсутствие соединения с Интернетом, модуль consumer хотел бы запросить сообщение, чтобы не потерять его и повторить попытку.

Я не предпочитаюнаписать бесконечный цикл для повторения попыток;также, если модуль будет перезапущен, сообщение будет потеряно.Поэтому я предпочитаю запросить сообщение у edgeHub / RocksDB.

Где найти документацию по доступным ответам, которые могут быть предоставлены для IoTHubMessageDispositionResult?какой ответ нужно отправить, если сообщение необходимо поставить в очередь?

if message.processed():
    return IoTHubMessageDispositionResult.ACCEPTED
else:
    return IoTHubMessageDispositionResult.??

1 Ответ

0 голосов
/ 15 февраля 2019

Вам не нужно реализовывать собственную очередь сообщений.IotEdge обеспечивает автономную функциональность, как описано в этом сообщении в блоге и на этой странице документации .

EdgeHub будет локально хранить сообщения на edgeDevice, если нет соединения сIotHub.Он автоматически начнет отправку этих сообщений (в правильном порядке), как только соединение будет установлено снова.

Вы можете настроить, как долго edgeHub будет буферизировать сообщения, например:

"$edgeHub": {
    "properties.desired": {
        "schemaVersion": "1.0",
        "routes": {},
        "storeAndForwardConfiguration": {
            "timeToLiveSecs": 7200
        }
    }
}

7200 секунд(2 часа) также используется по умолчанию, если вы ничего не настраиваете.

По умолчанию сообщения будут записываться в папку в док-контейнере edgeHub.Если вы хотите сохранить их где-то еще, вы можете сделать это с помощью этой конфигурации:

"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 , вы найдете ответ здесь :

class IoTHubMessageDispositionResult(Enum):
    ACCEPTED = 0
    REJECTED = 1
    ABANDONED = 2

Обновление2:

Сообщения, которые были ПРИНЯТЫЕ , удаляются из очереди сообщений, поскольку они были успешно доставлены.

Сообщения, которые ABANDONED снова добавляются в очередь сообщений, и модуль попытается отправить ее снова, как определено в retryPolicy.Для получения более подробной информации о retryPolicy вы можете прочитать это thread .

Сообщения, которые REJECTED больше не добавляются в очередь сообщений.

...