У меня есть несколько gen_server
рабочих, периодически запрашивающих некоторую информацию у аппаратных датчиков.Датчики могут временно выйти из строя, это нормально.Если датчик выходит из строя, рабочий прекращает работу с исключением.
Все работники создаются администратором формы со стратегией simple_one_to_one
.Также у меня есть элемент управления gen_server
, который может запускать и останавливать работников, а также получать 'DOWN'
сообщений.
Так что теперь у меня есть две проблемы:
Если работникперезапускается супервизором, его состояние теряется, что для меня неприемлемо.Мне нужно воссоздать работника с таким же состоянием.
Если работник несколько раз отказывал в течение определенного времени, что-то случилось с датчиками, и это требует внимания оператора.Поэтому мне нужно отказаться от перезапуска работника и отправить сообщение обработчикам событий.Но поведение супервизора по умолчанию завершается после предела перезапуска процесса выпуска.
Я вижу два решения:
Установите тип процессов всупервизор как временный и управляющий ими, и перезапускающий их в элементе управления gen_server
.Но это именно то, что должен делать супервизор, поэтому я заново изобретаю колесо.
Создайте супервизора для каждого работника под основным супервизором.Это точно решает мою вторую проблему, но состояние рабочих теряется после перезапуска, поэтому мне нужно какое-то хранилище, например, таблица ets, хранящая состояния рабочих.
Я очень плохо знаком с Erlang,поэтому мне нужен совет по моей проблеме, относительно которого (если таковое имеется) решение является лучшим.Заранее спасибо.