Я тоже смотрел на это тоже и сделал что-то похожее на Грега. Я не использовал метод Listen(), хотя я не думаю, что он предлагает мне ничего более и более простого Dequeue() - Listen() кажется полезным, когда вы хотите слушать от имени нескольких потребителей, что в моем случае не имеет отношения к делу (см. Oracle Docs).
Итак, Процесс B 'Сначала регистрирую для уведомлений перед началом процесса опроса для проверки любых существующих сообщений. Он не выполняет Listen(), он просто вызывает Dequeue() в пределах контролируемого цикла с периодом ожидания на пару секунд. Если процесс опроса встречает тайм-аут Oracle, период ожидания истек, а опрос останавливается. Мне может потребоваться рассмотреть вопрос о тайм-аутах, если период ожидания не истек (хотя не 100% уверен, что это произойдет, если это произойдет).
Я заметил, что любые сообщения, которые находятся в очереди, пока опрос вызовет метод уведомления по сообщениям, но к тому моменту, когда он подключится и пытается получить сообщение, процесс опроса всегда, кажется, взял его. Поэтому внутри метода уведомления сообщения я захватываю и игнорирую любые OracleExceptions с номером 25263 (no message in queue <...> with message ID <...>
).