I have a long running process that continuously waits on an Oracle queue, processes messages and waits back on the queue. This is done with a timeout (so the process can verify internal flags periodically) and within a transaction (so the message isn't lost should a processing error occur). The code is similar to the following:
Code: Select all
(...)
while(true)
{
try
{
using (var tx = connection.BeginTransaction())
{
var m = queue.Dequeue(new OracleQueueDequeueOptions
{
WaitTimeout = 10, // seconds
Navigation = OracleQueueNavigation.FirstMessage,
DequeueMode = OracleQueueDequeueMode.Remove
});
process(m);
tx.Commit();
}
}
catch (OracleException oe) when (oe.Code == 25228) // timeout or end of fetch during message dequeue
{
// OK. Wait on the queue again.
}
}
The exception along with stack trace is as follows:
Code: Select all
System.InvalidOperationException: Connection must be opened.
at Devart.Data.Oracle.OracleConnection.()
at Devart.Data.Oracle.OracleLob.()
at Devart.Data.Oracle.OracleLob.get_IsTemporary()
at Devart.Data.Oracle.OracleLob.g2ws489mf4g7nz77ms8quve5sfzvna8x ? ?? ? ()
at Devart.Data.Oracle.NativeOracleObjectBase.ConvertFromInternalValue(Object value, OracleAttribute attribute)
at Devart.Data.Oracle.OracleObject.5wdlpf5qy6cd2tee8kvlb5q8wzhf4xlr (NativeOracleObject )
at Devart.Data.Oracle.OracleObject.( , OracleConnection , Boolean )
at Devart.Data.Oracle.OracleParameter.(OracleDbType , Object , Type& , Object&, Byte[] , Hashtable , Int32 , Int32 , Int32 , Int32 , Boolean , Boolean , Boolean , Encoding , OracleCommand , ParameterDirection , ? , OracleType )
at Devart.Data.Oracle.OracleParameter.( & , Boolean , Boolean , OracleCommand, Byte[] , Hashtable , ? )
at Devart.Data.Oracle.OracleCommand.(OracleParameterCollection , [] , , ? )
at Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior behavior, IDisposable disposable, Int32 startRecord, Int32 maxRecords, Boolean nonQuery)
at Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior behavior, Boolean nonQuery)
at Devart.Data.Oracle.OracleCommand.ExecuteNonQuery()
at Devart.Data.Oracle.OracleQueue.Dequeue(OracleQueueDequeueOptions deqOptions)
Could you please investigate?
Thanks in advance.