Выборочное ускорение несвязанных сообщений в Oracle Advanced Queuing
-
09-10-2019 - |
Вопрос
Этот вопрос ссылается на укрытие сообщений в Oracle Streams Advanced Oneuation.
Мне нужно обеспечить, чтобы сообщения, связанные друг с другом, обрабатываются последовательно.
Например, предположить, что очередь семеется четырьмя сообщениями, которые имеют поле, связанное с бизнесом, называемым ссылкой транзакций (TXN_REF), а два сообщения (1,3) принадлежат к той же транзакции (000001):
id | txn_ref |
---+---------+
1 | 000001 |
2 | 000002 |
3 | 000001 |
4 | 000003 |
Предположим также, что я использую 4 потока / процессы, которые хотят ускорить из этой очереди. Следующее должно произойти:
- Тема 1 Сообщение Сообщение № 1
- Тема 2 Сообщение Сообщение № 2
- Thread 3 Сообщение # 4 (потому что сообщение № 3 связано с # 1 и # 1 еще не завершено).
- Тема 4 блока ждет сообщения
- Тема 1 совершает свою работу для сообщения # 1
- Тема 4 (или, возможно, нить 1) Сообщение № 3.
Моя начальная мысль заключалась в том, что я мог бы достичь этого с помощью условия нанесения детенышей, где enq_time (время enqueue) не позднее, чем любое другое enq_time всех сообщений, которые имеют одинаковый txn_ref. Но моя проблема заключается в том, как ссылаться на TXN_REF сообщения, которое я еще не выбрал, чтобы выбрать его. например
// Java API
String condition = "ENQ_TIME = (select min(ENQ_TIME) from AQ_TABLE1 where ??";
dequeueOption.setCondition(condition);
Можно ли достичь того, что я хочу здесь?
Решение
Чтобы ответить на ваш прямой вопрос, это может быть достигнуто с помощью correlation
поле (называемое CORRID
В таблице), который предназначен для этой цели.
Итак, на enqueue вы бы использовали AQMessageProperties.setCorrelation()
Способ с значением TXN_REF в качестве параметра. Тогда в вашем состоянии вы сделаете что-то подобное:
// Java API
String condition = "tab.ENQ_TIME = (select min(AQ_TABLE1.ENQ_TIME) from AQ_TABLE1 self where tab.CORRID=AQ_TABLE1.CORRID)";
dequeueOption.setCondition(condition);
Другие советы
Стратегия, которую вы можете попробовать, если это возможно, используют группы сообщений. То Документация Oracle кратко описывает его, но я нашел Эта статья Toad World быть гораздо более полезным. В основном вы настроиете таблицу очередей для обработки всех сообщений, совершенных одновременно как одна «группа». При наборе DEQUEUEING только один пользователь за один раз может ускорить из «группы» сообщений.