/// <summary>
        /// This method creates a background Task to handle the job.
        /// It will catches all exceptions
        /// </summary>
        /// <param name="eventArgs"></param>
        public void HandleMessage(BasicDeliverEventArgs eventArgs)
        {
            Task.Factory.StartNew(() =>
            {
                bool msgHandled = false;
                try
                {
                    BeforeHandlingMessage(eventArgs);
                    HandleMessage(eventArgs, out msgHandled);
                }
                catch (Exception ex)
                {
#if DEBUG
                    _watcher.ErrorFormat("5. The task to execute the provided callback with DTag: {0} by CTag: {1} has been finished but there is an error", eventArgs.DeliveryTag, eventArgs.ConsumerTag);
#endif
                    _watcher.Error(ex);
                    try
                    {
                        HandleError(eventArgs, ex);
                    }
                    catch (Exception errorHandlingEx)
                    {
                        _watcher.ErrorFormat("Failed to handle the exception: {0} because of {1}", ex.Message, errorHandlingEx.StackTrace);
                    }
                }
                finally
                {
                    CleanUp(eventArgs, msgHandled);
                }
            }, Global.DefaultTaskCreationOptionsProvider());
        }
Пример #2
0
 private void HandleMessageDeliveryInSeperatedThread(BasicDeliverEventArgs basicDeliverEventArgs)
 {
     Task.Factory.StartNew(() =>
     {
         try
         {
             _messageHandler.HandleMessage(basicDeliverEventArgs);
         }
         catch (Exception ex)
         {
             _watcher.Error(ex);
             Dispose();
         }
     }, Global.DefaultTaskCreationOptionsProvider());
 }
Пример #3
0
        private void CloseTunnel()
        {
            if (_disposed)
            {
                return;
            }

            _autoResetEvent.WaitOne();
            try
            {
                if (_dedicatedPublishingChannel != null)
                {
                    _dedicatedPublishingChannel.BasicAcks   -= OnBrokerReceivedMessage;
                    _dedicatedPublishingChannel.BasicNacks  -= OnBrokerRejectedMessage;
                    _dedicatedPublishingChannel.BasicReturn -= OnMessageIsUnrouted;
                }

                _consumerManager.ClearConsumers();

                //NOTE: Sometimes, disposing the channel blocks current thread
                var task = Task.Factory.StartNew(() => _createdChannels.ForEach(DisposeChannel), Global.DefaultTaskCreationOptionsProvider());
                task.ContinueWith(t => _createdChannels.Clear(), Global.DefaultTaskContinuationOptionsProvider());

                if (OnClosed != null)
                {
                    OnClosed();
                }
            }
            finally
            {
                _autoResetEvent.Set();
            }
        }
Пример #4
0
        public void Dispose()
        {
            _disposed = true;
            DisposeConsumerManager();

            //NOTE: Sometimes, disposing the channel blocks current thread
            var task = Task.Factory.StartNew(() => _createdChannels.ForEach(DisposeChannel), Global.DefaultTaskCreationOptionsProvider());

            task.ContinueWith(t => _createdChannels.Clear(), Global.DefaultTaskContinuationOptionsProvider())
            .Wait((int)Global.ConsumerDisposeTimeoutInSeconds * 1000);

            if (_connection.IsConnected)
            {
                _connection.Dispose();
            }
        }
Пример #5
0
        public void Dispose()
        {
            //NOTE: Sometimes, disposing the channel blocks current thread
            var task = Task.Factory.StartNew(() => _createdChannels.ForEach(DisposeChannel), Global.DefaultTaskCreationOptionsProvider());

            task.ContinueWith(t => _createdChannels.Clear(), Global.DefaultTaskContinuationOptionsProvider());

            if (_connection.IsConnected)
            {
                _connection.Dispose();
            }
            _consumerManager.Dispose();
        }