/// <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);
            }
        }
Exemplo n.º 2
0
 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;
     }
 }
Exemplo n.º 3
0
        /// <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);
            }
        }
Exemplo n.º 4
0
        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);
     }
 }
Exemplo n.º 6
0
        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.");
        }