public LinkConsumerConfiguration(
            TimeSpan recoveryInterval,
            ushort prefetchCount,
            bool autoAck,
            int priority,
            bool cancelOnHaFailover,
            bool exclusive,
            ILinkConsumerTopologyHandler topologyHandler,
            LinkStateHandler<LinkConsumerState> stateHandler,
            ILinkConsumerErrorStrategy errorStrategy,
            LinkConsumerMessageHandlerDelegate<byte[]> messageHandler,
            ILinkSerializer serializer
        )
        {
            if (recoveryInterval < TimeSpan.Zero)
                throw new ArgumentOutOfRangeException(nameof(recoveryInterval), "Must be greater than TimeSpan.Zero");
            
            if(prefetchCount == 0)
                throw new ArgumentOutOfRangeException(nameof(prefetchCount), "Must be greater than 0");

            RecoveryInterval = recoveryInterval;
            PrefetchCount = prefetchCount;
            AutoAck = autoAck;
            Priority = priority;
            CancelOnHaFailover = cancelOnHaFailover;
            Exclusive = exclusive;
            MessageHandler = messageHandler ?? throw new ArgumentNullException(nameof(messageHandler));
            ErrorStrategy = errorStrategy ?? throw new ArgumentNullException(nameof(errorStrategy));
            TopologyHandler = topologyHandler ?? throw new ArgumentNullException(nameof(topologyHandler));
            StateHandler = stateHandler ?? throw new ArgumentNullException(nameof(stateHandler));
            Serializer = serializer;
        }
 public static LinkConsumerMessageHandlerBuilder Create(
     LinkConsumerMessageHandlerDelegate <byte[]> onMessage
     )
 => new LinkConsumerMessageHandlerBuilder(
     (serializer, mapping) => onMessage,
     false,
     false
     );
        public ILinkConsumerBuilder Handler(LinkConsumerMessageHandlerDelegate <object> value)
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            return(new LinkConsumerBuilder(
                       this,
                       messageHandlerBuilder: LinkConsumerMessageHandlerBuilder.Create(value)
                       ));
        }
Example #4
0
        public static LinkConsumerMessageHandlerBuilder Create(
            LinkConsumerMessageHandlerDelegate <object> onMessage
            )
        => new LinkConsumerMessageHandlerBuilder(
            (serializer, mapping) => msg =>
        {
            object body;
            var props = msg.Properties.Clone();

            var typeName = props.Type;

            if (string.IsNullOrWhiteSpace(typeName))
            {
                return(Task.FromException <LinkConsumerAckStrategy>(new LinkCosumerTypeNameMappingException()));
            }

            typeName     = typeName.Trim();
            var bodyType = mapping.Map(typeName);

            if (bodyType == null)
            {
                return(Task.FromException <LinkConsumerAckStrategy>(
                           new LinkCosumerTypeNameMappingException(typeName)));
            }

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

            var concreteMsg = LinkMessageFactory
                              .ConstructConsumedMessage(bodyType, body, props, msg.RecieveProperties, msg.Cancellation);

            return(onMessage(concreteMsg));
        },
            true,
            true
            );
        public ILinkConsumerBuilder Handler <TBody>(LinkConsumerMessageHandlerDelegate <TBody> value) where TBody : class
        {
            if (value == null)
            {
                throw new ArgumentNullException(nameof(value));
            }

            if (typeof(TBody) == typeof(byte[]))
            {
                return(Handler(value as LinkConsumerMessageHandlerDelegate <byte[]>));
            }

            if (typeof(TBody) == typeof(object))
            {
                return(Handler(value as LinkConsumerMessageHandlerDelegate <object>));
            }

            return(new LinkConsumerBuilder(
                       this,
                       messageHandlerBuilder: LinkConsumerMessageHandlerBuilder.Create(value)
                       ));
        }
        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
                       ));
        }
 public static LinkConsumerMessageHandlerBuilder Create(
     LinkConsumerMessageHandlerDelegate <object> onMessage
     )
 => new LinkConsumerMessageHandlerBuilder(