private void BasicAck(IMessage request, RC.IModel channel) { var tag = request.Headers.DeliveryTag(); var deliveryTag = tag.HasValue ? tag.Value : 0; try { channel.BasicAck(deliveryTag, false); } catch (Exception e) { _logger?.LogError(e, "Failed to ack message"); } }
public void HandleMessage(string input, RC.IModel channel, IMessage message) { Assert.NotNull(input); Assert.NotNull(channel); Assert.NotNull(message); ulong deliveryTag = 0; if (message.Headers.DeliveryTag().HasValue) { deliveryTag = message.Headers.DeliveryTag().Value; } channel.BasicAck(deliveryTag, false); called.Value = true; }
public void ReviceMessage(string queueName, string someone, Action <string> eventHandel) { EventingBasicConsumer consumer = new EventingBasicConsumer(_chanel); _chanel.ExchangeDeclare(exchangeName, exchangeType, false, false, null); //_chanel.ExchangeDeclare(exchangeName, exchangeType); _chanel.QueueDeclare(queueName, false, false, false, null);//持久化 排他性 自动删除 _chanel.QueueBind(queueName, exchangeName, routingKey, null); //_chanel.QueueBind(queueName, exchangeName, routingKey + someone);//交换机与 consumer.Received += (ch, ea) => { var message = Encoding.UTF8.GetString(ea.Body); eventHandel?.Invoke(message); _chanel.BasicAck(ea.DeliveryTag, false);//确认该消息已被消费 }; _chanel.BasicConsume(queueName, false, consumer); //_chanel.BasicConsume(queueName, false, consumer); //启动消费者 // Console.WriteLine("客户端2已启动"); }
private async Task Consumer_Received(object sender, BasicDeliverEventArgs eventArgs) { var eventName = eventArgs.RoutingKey; var message = Encoding.UTF8.GetString(eventArgs.Body); try { var policy = Policy.Handle <InvalidOperationException>() .Or <Exception>() .WaitAndRetryAsync(_retryCount, retryAttempt => TimeSpan.FromSeconds(1), (ex, time) => { _logger.LogWarning(ex.ToString()); }); await policy.ExecuteAsync(async() => await ProcessEvent(eventName, message)); // to avoid losing messages _consumerChannel.BasicAck(deliveryTag: eventArgs.DeliveryTag, multiple: false); } catch (Exception ex) { // consider using a Dead Letter Exchange for undelivered messages. _logger.LogWarning(ex, "----- ERROR Processing message \"{Message}\"", message); } }
public void ProcessMessage(object sender, BasicDeliverEventArgs e) { var mi = MessageInfo(e); try { _logger.LogInformation($@"Got message {mi}"); TSrc src; using (var ms = new MemoryStream(e.Body)) { src = ProtoBuf.Serializer.Deserialize <TSrc>(ms); _logger.LogInformation($@"Message {mi} JSON view: {JsonConvert.SerializeObject(src, Formatting.Indented)}"); } var dst = _transformer.Transform(src); _writer.WriteAsync(dst).Wait(); _channel.BasicAck(e.DeliveryTag, false); OnProcessed?.Invoke(this, new MessageProcessedEventArgs <TSrc>(src)); _logger.LogInformation($"Message processed {mi}"); } catch (Exception ex) { _logger.LogError($@"Error message process {mi} Requeue after {_rabbitConfig.RequeueOnErrorAfter} Error {ex.Message}. {ex}"); OnProcessError?.Invoke(this, new MessageProcessErrorEventArgs(ex)); Task.Run(async() => { await Task.Delay(_rabbitConfig.RequeueOnErrorAfter); _channel?.BasicNack(e.DeliveryTag, false, true); _logger.LogInformation($@"Reqeue message {mi}"); }); } }