Page 1 of 1

Example code for asyncroneous notification with OracleQueue

Posted: Fri 13 Jun 2008 08:52
by ddeml77
Hello,

I am looking for an example code on how to properly dequeue a message in the OracleQueue.OnMessage handler.
  • Is OracleQueue thread safe so that concurrent invokes of Dequeue() (from the OnMessage handler) are supported?
  • Is it asserted that OnMessage is invoked for each and every received message?
  • Is there a possibility to invoke OracleQueue.Dequeue() in nonblocking mode or is it possible to check for pending messages?
  • The OracleQueueMessageEventArgs only provides OracleQueueMessageProperties, but not the OracleQueueMessage itself. What is the best way to fetch the acutal OracleMessage that raises the OnMessage event?
Should it be more like this:

Code: Select all

private void OracleQueue_OnMessage(object sender,
    OracleQueueMessageEventArgs args)
{
    OracleQueue oracleQueue = (OracleQueue)sender;
    //We tweack the DequeueOptions of the oracle queue to only dequeue
    //the message of out interest
    OracleQueueMessageId originalMessageId =
        oracleQueue.DequeueOptions.MessageId;
    oracleQueue.DequeueOptions.MessageId = args.MessageId;
    OracleQueueMessage message = oracleQueue.Dequeue();
    oracleQueue.DequeueOptions.MessageId = originalMessageId;
    //proceed with message from here
}
...or should it be more like this:

Code: Select all

private void OracleQueue_OnMessage(object sender,
    OracleQueueMessageEventArgs args)
{
    OracleQueue oracleQueue = (OracleQueue)sender;
    //Dirty HACK because OracleQueueDequeueOptions does not implement ICloneable
    OracleQueueDequeueOptions dequeueOptions = (OracleQueueDequeueOptions)
        typeof(OracleQueueDequeueOptions).GetMethod("MemberwiseClone",
        BindingFlags.NonPublic | BindingFlags.Instance, null,
        Type.EmptyTypes, null).Invoke(oracleQueue, null);
    dequeueOptions.MessageId = args.MessageId;
    OracleQueueMessage message = oracleQueue.Dequeue(dequeueOptions);
    //proceed with message from here
}
...or more like this?

Code: Select all

private void OracleQueue_OnMessage(object sender,
    OracleQueueMessageEventArgs args)
{
    OracleQueue oracleQueue = (OracleQueue)sender;
    //Ignore args.MessageId because it cannot be decently handeled
    //We just get any next message and dont care which message it has
    OracleQueueMessage message = oracleQueue.Dequeue();
    //proceed with message from here
}
Thanks in advance for any help!

Greetings - Richie

Posted: Tue 17 Jun 2008 13:59
by Alexey.mdr
Hello,

Please see "Advanced Queuing Technology Support" topic in the product help.
There are several samples there.

Regards,
Alexey.