/// <summary> /// Initializes the <see cref="IDequeueMessages" />. /// </summary> /// <param name="address">The address to listen on.</param> /// <param name="transactionSettings">The <see cref="TransactionSettings" /> to be used by <see cref="IDequeueMessages" />.</param> /// <param name="tryProcessMessage">Called when a message has been dequeued and is ready for processing.</param> /// <param name="endProcessMessage">Needs to be called by <see cref="IDequeueMessages" /> after the message has been processed regardless if the outcome was successful or not.</param> public void Init(Address address, TransactionSettings transactionSettings, Func<TransportMessage, bool> tryProcessMessage, Action<TransportMessage, Exception> endProcessMessage) { this.tryProcessMessage = tryProcessMessage; this.endProcessMessage = endProcessMessage; this.workQueue = this.NamePolicy.GetQueueName(address); this.clientInfo = string.Format("OracleAQDequeueStrategy for {0}", this.workQueue); this.transactionOptions = new TransactionOptions { IsolationLevel = transactionSettings.IsolationLevel, Timeout = transactionSettings.TransactionTimeout, }; this.dequeueOptions = new OracleAQDequeueOptions { DequeueMode = OracleAQDequeueMode.Remove, ProviderSpecificType = true, Wait = 0, }; if (this.PurgeOnStartup) { this.Purger.Purge(this.workQueue); } }
private static void DequeueTest_NoListen(int identifier) { try { var connection = new OracleConnection(ConnectionString); connection.Open(); var queue = new OracleAQQueue("SCHEDULE_QUEUE", connection) { MessageType = OracleAQMessageType.Raw, EnqueueOptions = { Visibility = OracleAQVisibilityMode.OnCommit, DeliveryMode = OracleAQMessageDeliveryMode.Persistent } }; var dequeueOptions = new OracleAQDequeueOptions { Visibility = OracleAQVisibilityMode.OnCommit, NavigationMode = OracleAQNavigationMode.NextMessage, DequeueMode = OracleAQDequeueMode.Remove, DeliveryMode = OracleAQMessageDeliveryMode.Persistent, Wait = -1 }; while (true) { Dequeue(connection, queue, dequeueOptions, identifier); } } catch (Exception e) { Log.Error(e.Message, e); throw; } }
/// <summary> /// Initializes the <see cref="IDequeueMessages" />. /// </summary> /// <param name="address">The address to listen on.</param> /// <param name="transactionSettings">The <see cref="TransactionSettings" /> to be used by <see cref="IDequeueMessages" />.</param> /// <param name="tryProcessMessage">Called when a message has been dequeued and is ready for processing.</param> /// <param name="endProcessMessage">Needs to be called by <see cref="IDequeueMessages" /> after the message has been processed regardless if the outcome was successful or not.</param> public void Init(Address address, TransactionSettings transactionSettings, Func <TransportMessage, bool> tryProcessMessage, Action <TransportMessage, Exception> endProcessMessage) { this.tryProcessMessage = tryProcessMessage; this.endProcessMessage = endProcessMessage; this.workQueue = this.NamePolicy.GetQueueName(address); this.clientInfo = string.Format("OracleAQDequeueStrategy for {0}", this.workQueue); this.transactionOptions = new TransactionOptions { IsolationLevel = transactionSettings.IsolationLevel, Timeout = transactionSettings.TransactionTimeout, }; this.dequeueOptions = new OracleAQDequeueOptions { DequeueMode = OracleAQDequeueMode.Remove, ProviderSpecificType = true, Wait = 0, }; if (this.PurgeOnStartup) { this.Purger.Purge(this.workQueue); } }
private static void DequeueTest_UsingListen(int identifier) { try { var aqueueAgent = new [] { new OracleAQAgent(null, "CS_SCHEDULER.SCHEDULE_QUEUE") }; var connection = new OracleConnection(ConnectionString); connection.Open(); var queue = new OracleAQQueue("SCHEDULE_QUEUE", connection) { MessageType = OracleAQMessageType.Raw, EnqueueOptions = { Visibility = OracleAQVisibilityMode.OnCommit, DeliveryMode = OracleAQMessageDeliveryMode.Persistent } }; var dequeueOptions = new OracleAQDequeueOptions { Visibility = OracleAQVisibilityMode.OnCommit, NavigationMode = OracleAQNavigationMode.NextMessage, DequeueMode = OracleAQDequeueMode.Remove, DeliveryMode = OracleAQMessageDeliveryMode.Persistent, Wait = -1 }; while (true) { var agent = OracleAQQueue.Listen(connection, aqueueAgent, 1); if (agent != null) { Dequeue(connection, queue, dequeueOptions, identifier); } } } catch (Exception e) { Log.Error(e.Message, e); Log.ErrorFormat("Identifier : {0}", identifier); Environment.Exit(0); } }
private void SetUpConnection() { try { RetryCount++; if (RetryCount > 60) { TraceSource.TraceEvent(TraceEventType.Critical, 5130, "Retry count exceeded: {0}", ConnectionInfo.ConnectionString); RetryCount = 30; } if (Connection != null) { Connection.StateChange -= Connection_StateChange; Queue.MessageAvailable -= Queue_Notification; try { Connection.Dispose(); } catch (Exception ex) { TraceSource.TraceEvent(TraceEventType.Error, 5132, "{0}", ex); } } Connection = new OracleConnection(ConnectionInfo.ConnectionString); Connection.Open(); CommitCommand = Connection.CreateCommand(); CommitCommand.CommandText = "COMMIT"; Connection.StateChange += Connection_StateChange; Queue = new OracleAQQueue("\"-DSL-\".NOTIFY_QUEUE", Connection, OracleAQMessageType.Udt, "-DSL-.NOTIFY_INFO_TYPE"); Queue.NotificationConsumers = new[] { ConsumerName }; Queue.DequeueOptions.ConsumerName = ConsumerName; Queue.DequeueOptions.DequeueMode = OracleAQDequeueMode.Remove; Queue.DequeueOptions.DeliveryMode = OracleAQMessageDeliveryMode.Persistent; Queue.DequeueOptions.Visibility = OracleAQVisibilityMode.OnCommit; Queue.DequeueOptions.NavigationMode = OracleAQNavigationMode.NextTransaction; Queue.MessageAvailable += Queue_Notification; var converters = new List <OracleNotifyInfoConverter>(); try { var deqOpt = new OracleAQDequeueOptions { Wait = 1, ConsumerName = ConsumerName, DequeueMode = OracleAQDequeueMode.Remove, DeliveryMode = OracleAQMessageDeliveryMode.Persistent, Visibility = OracleAQVisibilityMode.OnCommit, NavigationMode = OracleAQNavigationMode.NextTransaction }; OracleAQMessage msg; while ((msg = Queue.Dequeue(deqOpt)) != null) { var nic = msg.Payload as OracleNotifyInfoConverter; if (nic != null) { converters.Add(nic); } } } catch (OracleException ex) { var err = ex.Errors.Count > 0 ? ex.Errors[0] : null; if (err == null || err.Number != 25228) { TraceSource.TraceEvent(TraceEventType.Information, 5133, "{0}", ex); } } if (converters.Count > 0) { ProcessNotifyConverters(converters); } RetryCount = 0; } catch (Exception ex) { RetryCount++; TraceSource.TraceEvent(TraceEventType.Error, 5134, "{0}", ex); } }
private static void Dequeue(OracleConnection connection, OracleAQQueue queue, OracleAQDequeueOptions dequeueOptions, int identifier) { var transaction = connection.BeginTransaction(); try { var message = queue.Dequeue(dequeueOptions); if (message != null) { var data = Encoding.UTF8.GetString((byte[])message.Payload); Log.InfoFormat("[{0:D2}] : {1} ", identifier, data); Interlocked.Increment(ref TotalMessagesReceived); } } catch (OracleException ex) { if (ex.Number != NoMessagesErrorCode) { throw; } Log.InfoFormat("[{0:D2}] : NO DATA ", identifier); } transaction.Commit(); transaction.Dispose(); }
private TransportMessage ReceiveFromQueue() { OracleAQDequeueOptions options = new OracleAQDequeueOptions { DequeueMode = OracleAQDequeueMode.Remove, Wait = this.SecondsToWaitForMessage, ProviderSpecificType = true, }; TransportMessage transportMessage; using (OracleConnection conn = new OracleConnection(this.ConnectionString)) { conn.Open(); OracleAQQueue queue = new OracleAQQueue(this.inputQueueAddress, conn, OracleAQMessageType.Xml); OracleAQMessage aqMessage = null; try { aqMessage = queue.Dequeue(options); } catch (OracleException ex) { if (ex.Number != 25228) { throw; } } // No message? That's okay if (null == aqMessage) { return null; } Guid messageGuid = new Guid(aqMessage.MessageId); // the serialization has to go here since Oracle needs an open connection to // grab the payload from the message transportMessage = this.ExtractTransportMessage(aqMessage.Payload); transportMessage.Id = messageGuid.ToString(); transportMessage.IdForCorrelation = aqMessage.Correlation; } Logger.DebugFormat("Received message from queue {0}", this.inputQueueAddress); // Set the correlation Id if (string.IsNullOrEmpty(transportMessage.IdForCorrelation)) { transportMessage.IdForCorrelation = transportMessage.Id; } return transportMessage; }
private TransportMessage ReceiveFromQueue() { OracleAQDequeueOptions options = new OracleAQDequeueOptions { DequeueMode = OracleAQDequeueMode.Remove, Wait = this.SecondsToWaitForMessage, ProviderSpecificType = true }; OracleAQMessage aqMessage = null; TransportMessage transportMessage = null; this.transactionManager.RunInTransaction( (c) => { OracleAQQueue queue = new OracleAQQueue(this.InputQueue, c, OracleAQMessageType.Xml); aqMessage = queue.Dequeue(options); // No message? That's okay if (null == aqMessage) return; Guid messageGuid = new Guid(aqMessage.MessageId); // the serialization has to go here since Oracle needs an open connection to // grab the payload from the message transportMessage = this.ExtractTransportMessage(aqMessage.Payload); }); Logger.DebugFormat("Received message from queue {0}", this.QueueTable); // Set the correlation Id if (String.IsNullOrEmpty(transportMessage.IdForCorrelation)) transportMessage.IdForCorrelation = transportMessage.Id; return transportMessage; }
protected override void ReceiveFromQueue() { OracleAQDequeueOptions options = new OracleAQDequeueOptions { DequeueMode = OracleAQDequeueMode.Remove, Wait = this.SecondsToWaitForMessage, ProviderSpecificType = true }; OracleAQMessage aqMessage = null; TransportMessage transportMessage = null; try { GetTransactionManager().RunInTransaction( (c) => { OracleAQQueue queue = new OracleAQQueue(this.InputQueue, c, OracleAQMessageType.Xml); aqMessage = queue.Dequeue(options); // No message? That's okay if (null == aqMessage) return; Guid messageGuid = new Guid(aqMessage.MessageId); MessageId = messageGuid.ToString(); if (base.HandledMaxRetries(messageGuid.ToString())) { Logger.Error(string.Format("Message has failed the maximum number of times allowed, ID={0}.", MessageId)); this.MoveToErrorQueue(aqMessage); base.OnFinishedMessageProcessing(); return; } base.OnStartedMessageProcessing(); // the serialization has to go here since Oracle needs an open connection to // grab the payload from the message try { if (base.UseXmlTransportSeralization) transportMessage = this.ExtractXmlTransportMessage(aqMessage.Payload); else transportMessage = this.ExtractBinaryTransportMessage(aqMessage.Payload); } catch (Exception e) { Logger.Error("Could not extract message data.", e); this.MoveToErrorQueue(aqMessage); base.OnFinishedMessageProcessing(); // don't care about failures here return; // deserialization failed - no reason to try again, so don't throw } }); } catch (Exception e) { Logger.Error("Error in receiving message from queue.", e); throw; } // Set the correlation Id if (String.IsNullOrEmpty(transportMessage.IdForCorrelation)) transportMessage.IdForCorrelation = transportMessage.Id; // care about failures here var exceptionNotThrown = OnTransportMessageReceived(transportMessage); // and here var otherExNotThrown = OnFinishedMessageProcessing(); // but need to abort takes precedence - failures aren't counted here, // so messages aren't moved to the error queue. if (NeedToAbort) throw new AbortHandlingCurrentMessageException(); if (!(exceptionNotThrown && otherExNotThrown)) //cause rollback throw new ApplicationException("Exception occured while processing message."); }