示例#1
0
        public async Task Run()
        {
            var child = new ConsumerRunnerSlice
            {
                Channel = await Client.PullModel(),
                Qos     = Consumer.MinQos
            };

            if (isFirst)
            {
                isFirst = false;
                child.Channel.Model.ExchangeDeclare(Consumer.EventBus.Exchange, "direct", true);
                child.Channel.Model.QueueDeclare(Queue.Queue, true, false, false, null);
                child.Channel.Model.QueueBind(Queue.Queue, Consumer.EventBus.Exchange, Queue.RoutingKey);
            }
            child.Channel.Model.BasicQos(0, Consumer.MinQos, false);

            child.BasicConsumer           = new EventingBasicConsumer(child.Channel.Model);
            child.BasicConsumer.Received += async(ch, ea) =>
            {
                await Process(child, ea, 0);
            };
            child.BasicConsumer.ConsumerTag = child.Channel.Model.BasicConsume(Queue.Queue, Consumer.AutoAck, child.BasicConsumer);
            child.NeedRestart = false;
            Slices.Add(child);
            NowQos   += child.Qos;
            StartTime = DateTimeOffset.UtcNow;
        }
示例#2
0
        private async Task Process(ConsumerRunnerSlice consumerChild, BasicDeliverEventArgs ea)
        {
            try
            {
                await Consumer.Notice(ea.Body);

                if (!Consumer.Config.AutoAck)
                {
                    consumerChild.Channel.Model.BasicAck(ea.DeliveryTag, false);
                }
            }
            catch (Exception exception)
            {
                Logger.LogError(exception.InnerException ?? exception, $"An error occurred in {Consumer.EventBus.Exchange}-{Queue}");
                if (Consumer.Config.Reenqueue)
                {
                    await Task.Delay(1000);

                    consumerChild.Channel.Model.BasicReject(ea.DeliveryTag, true);
                }
                else
                {
                    consumerChild.NeedRestart = true;
                }
            }
        }
示例#3
0
        private async Task Process(ConsumerRunnerSlice consumerChild, BasicDeliverEventArgs ea, int count)
        {
            if (count > 0)
            {
                await Task.Delay(count * 1000);
            }
            try
            {
                await Consumer.Notice(ea.Body);

                if (!Consumer.AutoAck)
                {
                    try
                    {
                        consumerChild.Channel.Model.BasicAck(ea.DeliveryTag, false);
                    }
                    catch
                    {
                        consumerChild.NeedRestart = true;
                    }
                }
            }
            catch (Exception exception)
            {
                Logger.LogError(exception.InnerException ?? exception, $"An error occurred in {Consumer.EventBus.Exchange}-{Queue}");
                if (Consumer.ErrorReject)
                {
                    consumerChild.Channel.Model.BasicReject(ea.DeliveryTag, true);
                }
                else
                {
                    if (count > 3)
                    {
                        consumerChild.NeedRestart = true;
                    }
                    else
                    {
                        await Process(consumerChild, ea, count + 1);
                    }
                }
            }
        }
示例#4
0
        public async Task ExpandQos()
        {
            if (NowQos + Consumer.IncQos <= Consumer.MaxQos)
            {
                var child = new ConsumerRunnerSlice
                {
                    Channel = await Client.PullModel(),
                    Qos     = Consumer.IncQos
                };
                child.Channel.Model.BasicQos(0, Consumer.IncQos, false);

                child.BasicConsumer           = new EventingBasicConsumer(child.Channel.Model);
                child.BasicConsumer.Received += async(ch, ea) =>
                {
                    await Process(child, ea, 0);
                };
                child.BasicConsumer.ConsumerTag = child.Channel.Model.BasicConsume(Queue.Queue, Consumer.AutoAck, child.BasicConsumer);
                child.NeedRestart = false;
                Slices.Add(child);
                NowQos   += child.Qos;
                StartTime = DateTimeOffset.UtcNow;
            }
        }