Exemple #1
0
        private void ConsumerOnReceived(object sender, BasicDeliverEventArgs e)
        {
            try
            {
                var props = new LinkMessageProperties();
                props.Extend(e.BasicProperties);

                var recieveProps = new LinkRecieveProperties(e.Redelivered, e.Exchange, e.RoutingKey, _queue.Name,
                                                             props.AppId == _appId);

                var token = _consumerCancellationTokenSource.Token;

                var msg = new LinkConsumedMessage <byte[]>(e.Body, props, recieveProps, token);

                HandleMessageAsync(msg, e.DeliveryTag);
            }
            catch (Exception ex)
            {
                _logger.Error($"Recieve message error, NACKing: {ex}");

                try
                {
                    _actionQueue.Put(new LinkConsumerMessageAction(
                                         e.DeliveryTag,
                                         LinkConsumerAckStrategy.Nack,
                                         _consumerCancellationTokenSource.Token)
                                     );
                }
                catch
                {
                    // No-op
                }
            }
        }
Exemple #2
0
        private void HandleMessageAsync(LinkConsumedMessage <byte[]> msg, ulong deliveryTag)
        {
            var cancellation = msg.Cancellation;

            Task <LinkConsumerAckStrategy> task;

            try
            {
                task = _configuration.MessageHandler(msg);
            }
            catch (Exception ex)
            {
                task = Task.FromException <LinkConsumerAckStrategy>(ex);
            }

            task.ContinueWith(
                t => OnMessageHandledAsync(t, deliveryTag, cancellation),
                cancellation,
                TaskContinuationOptions.ExecuteSynchronously,
                TaskScheduler.Current
                );
        }
        public static LinkConsumerMessageHandlerBuilder Create <TBody>(
            LinkConsumerMessageHandlerDelegate <TBody> onMessage
            ) where TBody : class
        {
            if (typeof(TBody) == typeof(byte[]) || typeof(TBody) == typeof(object))
            {
                throw new ArgumentException("Type of TBody must be concrete and not equal byte[]");
            }

            return(new LinkConsumerMessageHandlerBuilder(
                       (serializer, mapping) => msg =>
            {
                TBody body;
                var props = msg.Properties.Clone();

                try
                {
                    body = serializer.Deserialize <TBody>(msg.Body, props);
                }
                catch (Exception ex)
                {
                    var sException = new LinkDeserializationException(msg, typeof(TBody), ex);
                    return Task.FromException <LinkConsumerAckStrategy>(sException);
                }

                var concreteMsg = new LinkConsumedMessage <TBody>(
                    body,
                    props,
                    msg.ReceiveProperties,
                    msg.Cancellation
                    );

                return onMessage(concreteMsg);
            },
                       true,
                       false
                       ));
        }