Почему отказались от использования очередей? В случае, если одна задача — один процесс, проблем бы с менеджером не было
Я к тому, что, мне кажется, эта задача решается проще, выделением блока try-catch в отдельный процесс, т.о. ошибки в одной из задач не будут влиять на другие. Что-то вроде
while (!$this->isShuttingDown()) {
$task = $this->taskProvider->getNextTask();
// fire and forget
$this->producer->runTask($task);
}
В статье преведены примеры проблемы в том числе и с try..catch, который к самой проблеме имеет весьма посредственное отношение. Суть в том, что менеджер документов это своеобразный реестр. Об этом тоже в статье есть :)
Если я правильно понял статью, то проблема в долгоживущем скрипте, который накапливает ошибки если ObjectManager — это синглтон.
Если бы скрипт обрабатывал таски по одному и умирал при исключении — этой проблемы не было. А "повреждённые" таски выглядят как классические failed или delayed messages в терминах message broker.
Согласен, эту задачу очень легко решить правильно изолировав обработку задачи.
Исключение из сервиса конечно могут выбрасываться, но только в том случае, если сам сервис не может их решить. Но в таком случае вообще не понятно что в данных и сейвить их бд чревато. Лучше не сейвить ничего и попробовать позже повторить операцию.
А чем эти сессии отличаются от обычных транзакций?
В Doctrine ORM есть, но судя по документации «в случае пожара» нужно закрыть EntityManager, правда что с этим дальше делать не ясно. Я с ORM не работал, может кто подскажет тут. Может даже Вы?
Проблемы использования Doctrine ODM в процессах-демонах