由现场RABBITMQ处理数据堵引起的一个小测试

对于MQ的了解估计也仅限于安装了,有时候一遇到问题就摸不着头脑,当然主要是因为功力不够深啊。

         当然,MQ堵的情况基本上都出现在爬虫跑了两三天之后,但是由于老的版本没有问题,于是跟老的版本进行了个简单的比对,结果发现原来某个属性的值不同造成的。noAck为true和false的时候,我简单观察了下MQ的状态。比如:我发两百万的数据,noAck为true时,mq队列中的数据一会的就发送给了爬虫;而noAck 为false时,这些数据在MQ的队列中至少要存两小时,可以想象当数据量过大的时候,就会造成MQ队列中数据堆积的情况了。。。。

@Override

public void handleMessage(MessageHandler handler) throws Exception {

if (handler == null) {

return;

}

do {

Channel channel = connecter.getChannel();

if (channel == null) {

break;

}

try {

                                //此处再改回true,为false的情况会造成mq消息堆积,但是不影响抓取

boolean noAck = true; 

if (!noAck) {

channel.basicQos(100);

}

QueueingConsumer consumer = new QueueingConsumer(channel);

channel.basicConsume(connecter.getQueueName(), noAck, consumer);

for (; runFlag;) {

try {

QueueingConsumer.Delivery delivery = consumer.nextDelivery();

log.trace("get message from rabbitmq " );

if (delivery != null) {

handler.onMessage(delivery.getBody(), delivery.getEnvelope().getRoutingKey());

}

if (!noAck) {

channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);

}

delivery = null;

} catch (InterruptedException e) {

log.warn("RabbitMQMessageReceiver Thread " + Thread.currentThread().getId() + " occer exception : ", e);

}

}

} finally {

if (channel != null) {

channel.abort();

}

}

} while (runFlag);

}


你可能感兴趣的:(由现场RABBITMQ处理数据堵引起的一个小测试)