У нас есть процесс, который в настоящее время использует Oracle DBMS_SCHEDULER для выполнения. Процесс запускается каждый раз, когда сервер получает данные от внешнего устройства. Планировщик Oracle настроен таким образом, что задание создается при получении внешних данных, задание выполняется немедленно и задание автоматически уничтожается по завершении.
Проблема здесь в том, что несколько устройств могут отправлять данные одновременно. Поскольку процесс включает в себя получение исключительных блокировок в разных точках во время выполнения, иногда одно задание будет переходить на другое, которое уже выполняется (оно отклоняется с помощью ORA-20000).
Я хотел бы как-то использовать механизм Oracle AQ (расширенные очереди) для решения этой проблемы. Я представляю очередь заданий, которые выполняются FIFO. Даже если внешнее устройство B отправляет данные, в то время как процесс в настоящее время обрабатывает данные с внешнего устройства A, очередь предотвращает обработку данных с устройства B до тех пор, пока обработка для устройства A не будет завершена.
Похоже, в документации Oracle нет отдельного раздела об этом типе обработки AQ, но, похоже, это будет довольно распространенный сценарий. Кто-нибудь еще решил этот тип проблемы с Oracle AQ?