Frage

Diese Frage bezieht sich auf die Warteschlangenauflösungs von Nachrichten in Oracle Streams Advanced Queuing .

Ich muss sicherstellen, dass die Nachrichten, die miteinander verwandt sind, werden der Reihe nach abgearbeitet.

Zum Beispiel sei angenommen die Warteschlange mit den vier Nachrichten ausgesät, die eine geschäftsrelevante Feld namens Transaktionsreferenz (txn_ref) und zwei der Nachrichten haben (1,3) gehört in derselben Transaktion (000001):

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

Es wird auch angenommen, dass ich 4 Threads leite / Prozesse, die aus dieser Warteschlange aus der Warteschlange entfernt werden sollen. Folgendes sollte auftreten:

  1. Thema 1 entnimmt Nachricht # 1
  2. Faden 2 entnimmt Nachricht # 2
  3. Gewinde 3 entnimmt message # 4 (weil message # 3 wird im Zusammenhang mit # 1 und # 1 noch nicht abgeschlossen).
  4. Faden waiting 4 Blöcke für eine Nachricht
  5. Faden 1 verpflichtet sich, seine Arbeit für message # 1
  6. Gewinde 4 (oder vielleicht 1 Gewinde) reiht message # 3.

Mein erster Gedanke war, dass ich dies mit einem dequeue Zustand erreichen konnte, wo die ENQ_TIME (enqueue Zeit) nicht später als alle anderen ENQ_TIME aller Nachrichten, die die gleiche TXN_REF haben. Aber mein Problem ist, wie die TXN_REF einer Nachricht verweisen, dass ich noch nicht ausgewählt, um es auszuwählen. z.

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

Ist es möglich, zu erreichen, was ich will hier?

War es hilfreich?

Lösung

Ihre direkte Frage zu beantworten, dies erreicht werden kann, das correlation Feld mit (CORRID in der Tabelle genannt), die für diesen Zweck ausgelegt ist.

Also, auf der enqueue, dann würden Sie die AQMessageProperties.setCorrelation() Methode mit dem TXN_REF Wert als Parameter verwenden. Dann in Ihrem Zustand würden Sie so etwas tun:

// 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);

Andere Tipps

Eine Strategie, die Sie versuchen können, wenn möglich, Nachrichtengruppen verwendet. Die Oracle Dokumentation es wird kurz beschrieben, aber ich fand diese Kröte Welt Artikel zu sein viel nützlicher. Grundsätzlich Sie Setup die Queue-Tabelle alle Nachrichten zur gleichen Zeit wie eine „Gruppe“ begangen zu behandeln. Wenn Warteschlangenauflösungs nur ein Benutzer zu einem Zeitpunkt kann von einer „Gruppe“ von Nachrichten aus der Warteschlange entfernt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top