Pregunta

Esta pregunta se refiere al desencolado de mensajes en Oracle Streams cola avanzada .

I necesita para garantizar que los mensajes que están relacionados entre sí se procesan de forma secuencial.

Por ejemplo, supongamos que la cola se siembra con los cuatro mensajes que tienen un campo relacionado-denominada referencia de la transacción (txn_ref) y dos de los mensajes (1,3) pertenecen a la misma transacción (000,001):

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

También se supone que estoy corriendo 4 hilos / procesos que desean quitar de la cola de esta cola. Lo siguiente debe ocurrir:

  1. hilo 1 Retiros de cola de mensaje # 1
  2. hilo 2 Retiros de cola de mensaje # 2
  3. hilo 3 Retiros de cola de mensaje # 4 (porque el mensaje # 3 está relacionado con # 1 y # 1 aún no ha completado).
  4. rosca 4 bloques a la espera de un mensaje
  5. 1 hilo compromete su trabajo para el mensaje # 1
  6. hilo 4 (o tal vez el hilo 1) Retiros de cola mensaje # 3.

Mi idea inicial era que podía lograr esto con una condición quitar de la cola, donde no es el ENQ_TIME (tiempo de puesta en cola) más tarde que cualquier otro ENQ_TIME de todos los mensajes que tienen la misma TXN_REF. Pero mi problema es cómo hacer referencia al TXN_REF de un mensaje que todavía no he elegido, con el fin de seleccionarlo. por ejemplo.

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

¿Es posible lograr lo que quiero aquí?

¿Fue útil?

Solución

Para responder a su pregunta directa, esto se puede lograr mediante el campo correlation (llamado CORRID en la tabla), que está diseñado para este fin.

Por lo tanto, en la puesta en cola, tendrá que utilizar el método AQMessageProperties.setCorrelation() con el valor TXN_REF como parámetro. Luego, en su condición que haría algo como esto:

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

Otros consejos

Una estrategia que se puede probar, si es posible, es el uso de Grupos de Mensaje. El la documentación de Oracle describe brevemente, pero he encontrado este artículo Toad World estar mucho más útil. Básicamente, la configuración de la tabla de cola para tratar todos los mensajes cometidos al mismo tiempo como uno "grupo". Cuando desencolado, sólo un usuario a la vez puede quitar de la cola de un "grupo" de los mensajes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top