OracleQueue - "Connection must be opened" raised on Dequeue
Posted: Mon 03 Sep 2018 11:37
Hi team,
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:
Most of the times this works just fine, but I've been getting sporadic "Connection must be opened" errors as soon as a message is added to the queue. The connection is most certainly open (I've checked) and Dequeue wouldn't react to the new message otherwise!
The exception along with stack trace is as follows:
I am running dotConnect v9.6.584 on .NET Core 2.1 (2.1.401) as a 32bit process (32bit OCI).
Could you please investigate?
Thanks in advance.
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.