2

この質問は、 Oracle Streams Advanced Queuingでのメッセージのデキューに関するものです。

相互に関連するメッセージが順次処理されるようにする必要があります。

たとえば、トランザクション参照 (txn_ref) と呼ばれるビジネス関連フィールドを持つ 4 つのメッセージがキューにシードされており、そのうちの 2 つのメッセージ (1,3) が同じトランザクション (000001) に属しているとします。

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

また、このキューからデキューしたい 4 つのスレッド/プロセスを実行しているとします。以下が発生するはずです。

  1. スレッド 1 がメッセージ #1 をデキューします
  2. スレッド 2 はメッセージ #2​​ をデキューします
  3. スレッド 3 はメッセージ #4 をデキューします (メッセージ #3 は #1 に関連しており、#1 がまだ完了していないため)。
  4. メッセージを待っているスレッド 4 ブロック
  5. スレッド 1 はメッセージ #1 の作業をコミットします
  6. スレッド 4 (またはおそらくスレッド 1) がメッセージ #3 をデキューします。

私の最初の考えは、ENQ_TIME (エンキュー時間) が同じ TXN_REF を持つすべてのメッセージの他の ENQ_TIME よりも遅くないデキュー条件でこれを達成できるということでした。しかし、私の問題は、まだ選択していないメッセージの TXN_REF を参照して選択する方法です。例えば

// Java API
String condition = "ENQ_TIME = (select min(ENQ_TIME) from AQ_TABLE1 where ??";
dequeueOption.setCondition(condition);

ここで私が望むものを達成することは可能ですか?

4

2 に答える 2

2

あなたの直接の質問に答えるために、これは、この目的のために設計されたcorrelationフィールド (テーブルで呼び出されます) を使用して達成できます。CORRID

したがって、エンキューでは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);
于 2010-10-25T20:35:39.303 に答える
1

可能であれば試すことができる戦略は、メッセージ グループを使用することです。Oracleのドキュメントでは簡単に説明されていますが、この Toad World の記事の方がはるかに役立つことがわかりました。基本的に、同時にコミットされたすべてのメッセージを 1 つの「グループ」として扱うようにキュー テーブルを設定します。デキューする場合、メッセージの「グループ」からデキューできるのは、一度に 1 人のユーザーだけです。

于 2010-10-26T12:46:32.257 に答える