Выборочное ускорение несвязанных сообщений в Oracle Advanced Queuing

StackOverflow https://stackoverflow.com/questions/3974500

Вопрос

Этот вопрос ссылается на укрытие сообщений в Oracle Streams Advanced Oneuation.

Мне нужно обеспечить, чтобы сообщения, связанные друг с другом, обрабатываются последовательно.

Например, предположить, что очередь семеется четырьмя сообщениями, которые имеют поле, связанное с бизнесом, называемым ссылкой транзакций (TXN_REF), а два сообщения (1,3) принадлежат к той же транзакции (000001):

id | txn_ref | 
---+---------+
 1 | 000001  |
 2 | 000002  |
 3 | 000001  |
 4 | 000003  |

Предположим также, что я использую 4 потока / процессы, которые хотят ускорить из этой очереди. Следующее должно произойти:

  1. Тема 1 Сообщение Сообщение № 1
  2. Тема 2 Сообщение Сообщение № 2
  3. Thread 3 Сообщение # 4 (потому что сообщение № 3 связано с # 1 и # 1 еще не завершено).
  4. Тема 4 блока ждет сообщения
  5. Тема 1 совершает свою работу для сообщения # 1
  6. Тема 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 только один пользователь за один раз может ускорить из «группы» сообщений.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top