How do I get events from a non-persistent queue?
How do I get events from a non-persistent queue?
How do I get events from a non-persistent queue? I can get the callback to trigger but when I try to dequeue the message I get an "ORA-25249 dequeue not allowed for queue" error.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Devart.Common;
using Devart.Data.Oracle;
namespace NonPersistentQueueTest
{
class Program
{
private const string QUEUE_NAME = "TEST_QUEUE2";
private const string QUEUE_TABLE_NAME = "TEST_QUEUE2_TABLE";
static void Main( string[] args )
{
Program pgm = new Program();
pgm.TestAQ();
}
void TestAQ()
{
OracleConnection oracleConnection = new OracleConnection( "data source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = CJAHN-W500.hps.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) );User Id=PipelineTest;Password=PipelineTest;" );
oracleConnection.Open();
OracleQueueAdmin oracleQueueAdmin = new OracleQueueAdmin( QUEUE_NAME, oracleConnection );
oracleQueueAdmin.Options.QueueType = OracleQueueType.NonPersistentMultiConsumers;
oracleQueueAdmin.CreateQueue();
oracleQueueAdmin.StartQueue();
// Register Bob and Scott as known recipients.
// This is required to send messages to Bob or Scott personally.
oracleQueueAdmin.AddSubscriber( new OracleQueueAgent( "Bob" ) );
oracleQueueAdmin.AddSubscriber( new OracleQueueAgent( "Scott" ) );
OracleQueue oracleEnqueueQueue = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleEnqueueQueue.EnqueueOptions.Visibility = OracleQueueVisibility.Immediate;
// This message will be delivered to Bob only.
OracleQueueMessage message1 = new OracleQueueMessage();
message1.StringPayload = "Message for Bob.";
message1.MessageProperties.RecipientList.Add( new OracleQueueAgent( "Bob" ) );
// This message will be delivered to all recipients, as there is no specific member in the recipients list.
OracleQueueMessage message2 = new OracleQueueMessage();
message2.StringPayload = "Message for all.";
// Create an OracleQueue instance that will receive general notifications and notifications for Scott.
OracleQueue oracleDequeueScott = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleDequeueScott.DequeueOptions.Navigation = OracleQueueNavigation.FirstMessage;
oracleDequeueScott.DequeueOptions.ConsumerName = "Scott";
// Set up asynchronous notification using events.
// The event just signals that a new message is available; messages are not dequeued implicitly.
oracleDequeueScott.AsyncNotification = true;
oracleDequeueScott.OnMessage += new OracleQueueMessageEventHandler( oracleDequeueScott_OnMessage );
// Create an OracleQueue instance that will receive general notifications and notifications for Bob.
OracleQueue oracleDequeueBob = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleDequeueBob.DequeueOptions.Navigation = OracleQueueNavigation.FirstMessage;
oracleDequeueBob.DequeueOptions.ConsumerName = "Bob";
oracleDequeueBob.AsyncNotification = true;
oracleDequeueBob.OnMessage += new OracleQueueMessageEventHandler( oracleDequeueBob_OnMessage );
// Enqueue the messages
oracleEnqueueQueue.Enqueue( message1 );
oracleEnqueueQueue.Enqueue( message2 );
// Wait a little so the events can fire.
System.Threading.Thread.Sleep( 10000 );
Console.ReadLine();
oracleQueueAdmin.StopQueue();
oracleQueueAdmin.DropQueue();
oracleConnection.Close();
}
// A helper function that dequeues messages during an event
string getMessageData( object sender, OracleQueueMessageEventArgs e )
{
OracleQueue oracleDequeue = sender as OracleQueue;
OracleQueueDequeueOptions dequeueOptions = oracleDequeue.DequeueOptions;
dequeueOptions.MessageId = e.MessageId;
// Messages are not deleted from server once dequeued.
dequeueOptions.DequeueMode = OracleQueueDequeueMode.Browse;
OracleQueueMessage msg = oracleDequeue.Dequeue( dequeueOptions );
return msg.StringPayload;
}
// Simple event handlers that write something into console when a message is received
void oracleDequeueBob_OnMessage( object sender, OracleQueueMessageEventArgs e )
{
string messageData = getMessageData( sender, e );
Console.WriteLine( "Bob receives a message: " + messageData );
}
void oracleDequeueScott_OnMessage( object sender, OracleQueueMessageEventArgs e )
{
string messageData = getMessageData( sender, e );
Console.WriteLine( "Scott receives a message: " + messageData );
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Devart.Common;
using Devart.Data.Oracle;
namespace NonPersistentQueueTest
{
class Program
{
private const string QUEUE_NAME = "TEST_QUEUE2";
private const string QUEUE_TABLE_NAME = "TEST_QUEUE2_TABLE";
static void Main( string[] args )
{
Program pgm = new Program();
pgm.TestAQ();
}
void TestAQ()
{
OracleConnection oracleConnection = new OracleConnection( "data source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = CJAHN-W500.hps.com)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE) ) );User Id=PipelineTest;Password=PipelineTest;" );
oracleConnection.Open();
OracleQueueAdmin oracleQueueAdmin = new OracleQueueAdmin( QUEUE_NAME, oracleConnection );
oracleQueueAdmin.Options.QueueType = OracleQueueType.NonPersistentMultiConsumers;
oracleQueueAdmin.CreateQueue();
oracleQueueAdmin.StartQueue();
// Register Bob and Scott as known recipients.
// This is required to send messages to Bob or Scott personally.
oracleQueueAdmin.AddSubscriber( new OracleQueueAgent( "Bob" ) );
oracleQueueAdmin.AddSubscriber( new OracleQueueAgent( "Scott" ) );
OracleQueue oracleEnqueueQueue = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleEnqueueQueue.EnqueueOptions.Visibility = OracleQueueVisibility.Immediate;
// This message will be delivered to Bob only.
OracleQueueMessage message1 = new OracleQueueMessage();
message1.StringPayload = "Message for Bob.";
message1.MessageProperties.RecipientList.Add( new OracleQueueAgent( "Bob" ) );
// This message will be delivered to all recipients, as there is no specific member in the recipients list.
OracleQueueMessage message2 = new OracleQueueMessage();
message2.StringPayload = "Message for all.";
// Create an OracleQueue instance that will receive general notifications and notifications for Scott.
OracleQueue oracleDequeueScott = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleDequeueScott.DequeueOptions.Navigation = OracleQueueNavigation.FirstMessage;
oracleDequeueScott.DequeueOptions.ConsumerName = "Scott";
// Set up asynchronous notification using events.
// The event just signals that a new message is available; messages are not dequeued implicitly.
oracleDequeueScott.AsyncNotification = true;
oracleDequeueScott.OnMessage += new OracleQueueMessageEventHandler( oracleDequeueScott_OnMessage );
// Create an OracleQueue instance that will receive general notifications and notifications for Bob.
OracleQueue oracleDequeueBob = new OracleQueue( QUEUE_NAME, oracleConnection );
oracleDequeueBob.DequeueOptions.Navigation = OracleQueueNavigation.FirstMessage;
oracleDequeueBob.DequeueOptions.ConsumerName = "Bob";
oracleDequeueBob.AsyncNotification = true;
oracleDequeueBob.OnMessage += new OracleQueueMessageEventHandler( oracleDequeueBob_OnMessage );
// Enqueue the messages
oracleEnqueueQueue.Enqueue( message1 );
oracleEnqueueQueue.Enqueue( message2 );
// Wait a little so the events can fire.
System.Threading.Thread.Sleep( 10000 );
Console.ReadLine();
oracleQueueAdmin.StopQueue();
oracleQueueAdmin.DropQueue();
oracleConnection.Close();
}
// A helper function that dequeues messages during an event
string getMessageData( object sender, OracleQueueMessageEventArgs e )
{
OracleQueue oracleDequeue = sender as OracleQueue;
OracleQueueDequeueOptions dequeueOptions = oracleDequeue.DequeueOptions;
dequeueOptions.MessageId = e.MessageId;
// Messages are not deleted from server once dequeued.
dequeueOptions.DequeueMode = OracleQueueDequeueMode.Browse;
OracleQueueMessage msg = oracleDequeue.Dequeue( dequeueOptions );
return msg.StringPayload;
}
// Simple event handlers that write something into console when a message is received
void oracleDequeueBob_OnMessage( object sender, OracleQueueMessageEventArgs e )
{
string messageData = getMessageData( sender, e );
Console.WriteLine( "Bob receives a message: " + messageData );
}
void oracleDequeueScott_OnMessage( object sender, OracleQueueMessageEventArgs e )
{
string messageData = getMessageData( sender, e );
Console.WriteLine( "Scott receives a message: " + messageData );
}
}
}