2019独角兽企业重金招聘Python工程师标准>>>
对于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);
}