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; }
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; } } }
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); } } } }
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; } }