Этот вопрос относится к снятию очереди сообщений в Oracle Streams Advanced Queuing .
Мне нужно убедиться, что сообщения, связанные друг с другом, обрабатываются последовательно.
Например, предположим, что очередь заполнена четырьмя сообщениями, имеющими связанное с бизнесом поле, называемое ссылкой на транзакцию (txn_ref), и два из сообщений (1,3) принадлежат одной и той же транзакции (000001):
id | txn_ref |
---+---------+
1 | 000001 |
2 | 000002 |
3 | 000001 |
4 | 000003 |
Предположим также, что я запускаю 4 потока / процесса, которые хотят удалить из этой очереди очередь.Должно произойти следующее:
- поток 1 удаляет сообщение # 1
- поток 2 удаляет сообщение # 2
- поток 3 удаляет сообщение # 4 (поскольку сообщение # 3относится к # 1, а # 1 еще не завершено).
- поток 4 блокирует ожидание сообщения
- поток 1 фиксирует свою работу для сообщения # 1
- поток 4 (или, возможно, поток 1) удаляет сообщение № 3.
Первоначально я думал, что я могу достичь этого с условием удаления, когда ENQ_TIME (время постановки в очередь) не позднее, чем любой другой ENQ_TIME всех сообщенийкоторые имеют тот же TXN_REF.Но моя проблема в том, как сослаться на TXN_REF сообщения, которое я еще не выбрал, чтобы выбрать его.например,
// Java API
String condition = "ENQ_TIME = (select min(ENQ_TIME) from AQ_TABLE1 where ??";
dequeueOption.setCondition(condition);
Можно ли здесь добиться того, чего я хочу?