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;
            }
Esempio n. 3
0
        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已启动");
        }
Esempio n. 4
0
        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}");
                });
            }
        }