Esempio n. 1
0
        public SqsNotificationListener(
            SqsQueueBase queue,
            IMessageSerializationRegister serializationRegister,
            IMessageMonitor messagingMonitor,
            ILoggerFactory loggerFactory,
            IMessageContextAccessor messageContextAccessor,
            Action <Exception, Amazon.SQS.Model.Message> onError = null,
            IMessageLockAsync messageLock = null,
            IMessageBackoffStrategy messageBackoffStrategy = null)
        {
            _queue            = queue;
            _messagingMonitor = messagingMonitor;
            onError           = onError ?? DefaultErrorHandler;
            _log = loggerFactory.CreateLogger("JustSaying");

            _messageProcessingStrategy = new DefaultThrottledThroughput(_messagingMonitor);
            _messageHandlerWrapper     = new MessageHandlerWrapper(messageLock, _messagingMonitor);

            _messageDispatcher = new MessageDispatcher(
                _queue,
                serializationRegister,
                messagingMonitor,
                onError,
                _handlerMap,
                loggerFactory,
                messageBackoffStrategy,
                messageContextAccessor);

            Subscribers = new Collection <ISubscriber>();

            if (messageBackoffStrategy != null)
            {
                _requestMessageAttributeNames.Add(MessageSystemAttributeName.ApproximateReceiveCount);
            }
        }
Esempio n. 2
0
        public MessageReceiveBuffer(
            int prefetch,
            int bufferSize,
            TimeSpan readTimeout,
            TimeSpan sqsWaitTime,
            ISqsQueue sqsQueue,
            MiddlewareBase <ReceiveMessagesContext, IList <Message> > sqsMiddleware,
            IMessageMonitor monitor,
            ILogger <IMessageReceiveBuffer> logger,
            IMessageBackoffStrategy messageBackoffStrategy = null)
        {
            _prefetch    = prefetch;
            _bufferSize  = bufferSize;
            _readTimeout = readTimeout;
            _sqsWaitTime = sqsWaitTime;
            if (sqsQueue == null)
            {
                throw new ArgumentNullException(nameof(sqsQueue));
            }
            _sqsQueueReader      = new SqsQueueReader(sqsQueue);
            _sqsMiddleware       = sqsMiddleware ?? throw new ArgumentNullException(nameof(sqsMiddleware));
            _monitor             = monitor ?? throw new ArgumentNullException(nameof(monitor));
            _logger              = logger ?? throw new ArgumentNullException(nameof(logger));
            _backoffStrategyName = messageBackoffStrategy?.GetType()?.Name;

            _channel = Channel.CreateBounded <IQueueMessageContext>(bufferSize);

            if (messageBackoffStrategy != null)
            {
                _requestMessageAttributeNames.Add(MessageSystemAttributeName.ApproximateReceiveCount);
            }
        }
Esempio n. 3
0
 /// <summary>
 /// Constructs a <see cref="BackoffMiddleware"/> with a given backoff strategy and logger/monitor.
 /// </summary>
 /// <param name="backoffStrategy">An <see cref="IMessageBackoffStrategy"/> to use to determine how long to delay message redelivery when a handler returns false or throws.</param>
 /// <param name="loggerFactory">An <see cref="ILoggerFactory"/> to use when logging request failures.</param>
 /// <param name="monitor">An <see cref="IMessageMonitor"/> to use when recording request failures.</param>
 public BackoffMiddleware(IMessageBackoffStrategy backoffStrategy, ILoggerFactory loggerFactory, IMessageMonitor monitor)
 {
     _backoffStrategy = backoffStrategy ?? throw new ArgumentNullException(nameof(backoffStrategy));
     _monitor         = monitor ?? throw new ArgumentNullException(nameof(monitor));
     _logger          = loggerFactory?.CreateLogger <BackoffMiddleware>() ??
                        throw new ArgumentNullException(nameof(loggerFactory));
 }
 public MessageDispatcher(
     IMessageSerializationRegister serializationRegister,
     IMessageMonitor messagingMonitor,
     HandlerMap handlerMap,
     ILoggerFactory loggerFactory,
     IMessageBackoffStrategy messageBackoffStrategy,
     IMessageContextAccessor messageContextAccessor)
 {
     _serializationRegister = serializationRegister;
     _messagingMonitor      = messagingMonitor;
     _handlerMap            = handlerMap;
     _logger = loggerFactory.CreateLogger("JustSaying");
     _messageBackoffStrategy = messageBackoffStrategy;
     _messageContextAccessor = messageContextAccessor;
 }
 public MessageDispatcher(
     SqsQueueBase queue,
     IMessageSerialisationRegister serialisationRegister,
     IMessageMonitor messagingMonitor,
     Action <Exception, SQSMessage> onError,
     HandlerMap handlerMap,
     ILoggerFactory loggerFactory,
     IMessageBackoffStrategy messageBackoffStrategy)
 {
     _queue = queue;
     _serialisationRegister = serialisationRegister;
     _messagingMonitor      = messagingMonitor;
     _onError                = onError;
     _handlerMap             = handlerMap;
     _log                    = loggerFactory.CreateLogger("JustSaying");
     _messageBackoffStrategy = messageBackoffStrategy;
 }
Esempio n. 6
0
        /// <summary>
        /// If an <see cref="IMessageBackoffStrategy"/> has been registered in services, then this will create
        /// a <see cref="BackoffMiddleware"/> and add it to the pipeline.
        /// </summary>
        /// <param name="builder">The <see cref="HandlerMiddlewareBuilder"/> to add the middleware to.</param>
        /// <param name="backoffStrategy">The <see cref="IMessageBackoffStrategy"/> to use to determine message visibility timeouts.</param>
        /// <returns>The current <see cref="HandlerMiddlewareBuilder"/>.</returns>
        /// <exception cref="ArgumentNullException">When the <see cref="HandlerMiddlewareBuilder"/> is null.</exception>
        public static HandlerMiddlewareBuilder UseBackoff(this HandlerMiddlewareBuilder builder, IMessageBackoffStrategy backoffStrategy)
        {
            if (builder == null)
            {
                throw new ArgumentNullException(nameof(builder));
            }
            if (backoffStrategy == null)
            {
                throw new ArgumentNullException(nameof(backoffStrategy));
            }

            var loggerFactory = builder.ServiceResolver.ResolveService <ILoggerFactory>();
            var monitor       = builder.ServiceResolver.ResolveService <IMessageMonitor>();

            return(builder.Use(new BackoffMiddleware(backoffStrategy, loggerFactory, monitor)));
        }