public void Execute(Action handler, IMessageAcceptor ma, CancellationToken cancellationToken)
 {
     try
     {
         handler();
         ma.Accept();
     }
     catch (DefaultErrorResponseException e) when(e.StatusCode == HttpStatusCode.BadRequest)
     {
         _badRequestStrategy.Execute(handler, ma, cancellationToken);
     }
     catch (Exception)
     {
         _defaultStrategy.Execute(handler, ma, cancellationToken);
     }
 }
Esempio n. 2
0
        internal EventContext(
            BasicDeliverEventArgs basicDeliverEventArgs,
            T evt,
            IMessageAcceptor ma,
            RabbitMqSubscriptionSettings settings,
            int middlewareQueueIndex,
            IMiddlewareQueue <T> middlewareQueue,
            CancellationToken cancellationToken)
        {
            BasicDeliverEventArgs = basicDeliverEventArgs;
            Event             = evt;
            MessageAcceptor   = ma;
            Settings          = settings;
            CancellationToken = cancellationToken;

            _middlewareQueueIndex = middlewareQueueIndex;
            _middlewareQueue      = middlewareQueue;
        }
Esempio n. 3
0
 public void Execute(Action handler, IMessageAcceptor ma, CancellationToken cancellationToken)
 {
     try
     {
         handler();
         ma.Accept();
     }
     catch (Exception ex)
     {
         // ReSharper disable once MethodSupportsCancellation
         _log.WriteWarningAsync(
             nameof(ResilientErrorHandlingStrategy),
             _settings.GetSubscriberName(),
             "Message handling",
             $"Failed to handle the message. Send it to poison queue {_settings.QueueName}-poison. Exception {ex}")
         .GetAwaiter().GetResult();
         ma.Reject();
     }
 }
 public void Execute(Action handler, IMessageAcceptor ma, CancellationToken cancellationToken)
 {
     try
     {
         handler();
         ma.Accept();
     }
     catch (Exception ex)
     {
         // ReSharper disable once MethodSupportsCancellation
         _log.WriteErrorAsync(_settings.GetSubscriberName(), "Message handling", _settings.GetSubscriberName(), ex).GetAwaiter().GetResult();
         if (_next == null)
         {
             ma.Accept();
         }
         else
         {
             _next.Execute(handler, ma, cancellationToken);
         }
     }
 }
Esempio n. 5
0
 public abstract Task <IResult> Handle(T message, IDeviceState state, IMessageAcceptor emitter);
        public override async Task <IResult> Handle(ButtonUpEvent message, IDeviceState state, IMessageAcceptor emitter)
        {
            if (!(state is ButtonState buttonState))
            {
                return(Result.Failure("Invalid State"));
            }

            if (buttonState.Pressed)
            {
                buttonState.Pressed = false;
                emitter.AcceptMessage(new DeviceStateChangedEvent
                {
                    DeviceId  = message.DeviceId,
                    MessageId = Guid.NewGuid(),
                    State     = state
                });
            }

            return(Result.Success());
        }
        public void Execute(Action handler, IMessageAcceptor ma, CancellationToken cancellationToken)
        {
            var isAllAttemptsFailed = false;

            try
            {
                handler();
            }
            catch (Exception ex)
            {
                // Message processing is failed, entering to the retries

                // ReSharper disable once MethodSupportsCancellation
                _log.WriteWarningAsync(
                    nameof(ResilientErrorHandlingStrategy),
                    _settings.GetSubscriberName(),
                    "Message handling",
                    $"Failed to handle the message for the first time. Retry in {_retryTimeout.Seconds} sec. Exception {ex}")
                .GetAwaiter().GetResult();

                // Retries loop

                for (int i = 0; i < _retryNum; i++)
                {
                    // Adding delay between attempts

                    // ReSharper disable once MethodSupportsCancellation
                    Task.Delay(_retryTimeout, cancellationToken).GetAwaiter().GetResult();

                    try
                    {
                        handler();

                        // The message was processed after all, so no more retries needed

                        return;
                    }
                    catch (Exception ex2)
                    {
                        // ReSharper disable once MethodSupportsCancellation
                        _log.WriteWarningAsync(
                            nameof(ResilientErrorHandlingStrategy),
                            _settings.GetSubscriberName(),
                            "Message handling",
                            $"Failed to handle the message for the {i + 1} time. Retry in {_retryTimeout.Seconds} sec. Exception {ex2}")
                        .GetAwaiter().GetResult();
                    }
                }

                // All attempts is failed, need to call next strategy in the chain

                isAllAttemptsFailed = true;

                if (_next == null)
                {
                    // Swallow the message if no more strategy is chained

                    ma.Accept();
                }
                else
                {
                    _next.Execute(handler, ma, cancellationToken);
                }
            }
            finally
            {
                // Finally, the message should be accepted, if it was successfully processed

                if (!isAllAttemptsFailed)
                {
                    ma.Accept();
                }
            }
        }