コード例 #1
0
        public void Consume(Action <string> consumeAction, string queue)
        {
            try
            {
                using (var channel = _conn.CreateModel())
                {
                    channel.QueueDeclare(queue, RabbitMqParameters.IsDurable, false, true, null);
                    //如果接受一个消息但是没有应答,客户端不会接受下一个消息
                    channel.BasicQos(0, 1, false);
                    //定义一个消费者在队列上
                    var consumer2 = new EventingBasicConsumer(channel);
                    //消费队列  设置应答模式为程序主动应答

                    while (true)
                    {
                        Thread.Sleep(100);
                        consumer2.Received += (sender, ea) =>
                        {
                            MsgConsumeResult consumeResult = MsgConsumeResult.Retry;
                            ulong            delivertTag   = 0;

                            delivertTag = ea.DeliveryTag;
                            byte[] data = ea.Body;
                            string msg  = Encoding.UTF8.GetString(data);
                            try
                            {
                                consumeAction(msg);
                                consumeResult = MsgConsumeResult.Accept;
                            }
                            catch (Exception)
                            {
                                consumeResult = MsgConsumeResult.Reject;
                                // 记录日志
                                // TODO...
                            }
                            finally
                            {
                                switch (consumeResult)
                                {
                                case MsgConsumeResult.Accept:
                                    //回复确认处理成功
                                    channel.BasicAck(delivertTag, false);
                                    break;

                                case MsgConsumeResult.Reject:
                                    //严重错误  写日志
                                    channel.BasicNack(delivertTag, false, false);
                                    break;
                                }
                            }
                        };
                        channel.BasicConsume(queue, false, consumer2);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }
コード例 #2
0
        public void Consume(Func <string, bool> consumeFunc, string queue)
        {
            try
            {
                using (var channel = _conn.CreateModel())
                {
                    channel.QueueDeclare(queue, RabbitMqParameters.IsDurable, false, true, null);
                    //如果接受一个消息但是没有应答,客户端不会接受下一个消息
                    channel.BasicQos(0, 1, false);
                    //定义一个消费者在队列上
                    var consumer = new EventingBasicConsumer(channel);
                    //消费队列  设置应答模式为程序主动应答

                    while (true)
                    {
                        Thread.Sleep(100);
                        int tryNum = 0;
                        consumer.Received += (sender, ea) =>
                        {
                            MsgConsumeResult consumeResult = MsgConsumeResult.Retry;
                            ulong            delivertTag   = 0;

                            delivertTag = ea.DeliveryTag;
                            byte[] data = ea.Body;
                            string msg  = Encoding.UTF8.GetString(data);
                            try
                            {
                                if (consumeFunc(msg))
                                {
                                    consumeResult = MsgConsumeResult.Accept;
                                }
                                else
                                {
                                    consumeResult = MsgConsumeResult.Retry;
                                }
                            }
                            catch (Exception)
                            {
                                consumeResult = MsgConsumeResult.Reject;
                                // 记录日志
                                // TODO...
                            }
                            finally
                            {
                                switch (consumeResult)
                                {
                                case MsgConsumeResult.Accept:
                                    //回复确认处理成功
                                    channel.BasicAck(delivertTag, false);
                                    break;

                                case MsgConsumeResult.Reject:
                                    //从消息队列中抛弃
                                    channel.BasicNack(delivertTag, false, false);
                                    break;

                                case MsgConsumeResult.Retry:
                                    tryNum += 1;
                                    if (tryNum < 5)
                                    {
                                        channel.BasicNack(delivertTag, false, true);    //重试次数小于等于5,继续重试
                                    }
                                    else
                                    {
                                        channel.BasicNack(delivertTag, false, false);    //重试次数大于5,抛弃并记录日志
                                        tryNum = 0;
                                        // 记录日志
                                        // TODO...
                                    }
                                    break;
                                }
                            }
                        };
                        channel.BasicConsume(queue, false, consumer);
                    }
                }
            }
            catch (Exception)
            {
                throw;
            }
        }