|
@@ -32,6 +32,8 @@ import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
|
|
|
import com.google.common.util.concurrent.ThreadFactoryBuilder;
|
|
|
import com.tzld.crawler.etl.model.vo.CrawlerEtlParam;
|
|
|
import com.tzld.crawler.etl.service.EtlService;
|
|
|
+import com.tzld.crawler.etl.util.CommonUtils;
|
|
|
+import org.apache.commons.lang3.RandomUtils;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
@@ -73,8 +75,6 @@ public class EtlMQConsumer {
|
|
|
private MQConsumer consumer;
|
|
|
private ThreadPoolExecutor priorityPool;
|
|
|
|
|
|
- private BlockingQueue<String> ackReceiptHandleQueue;
|
|
|
-
|
|
|
public EtlMQConsumer(EtlService etlService) {
|
|
|
this.etlService = etlService;
|
|
|
}
|
|
@@ -88,7 +88,7 @@ public class EtlMQConsumer {
|
|
|
new ThreadFactoryBuilder().setNameFormat("priority-etl-pool-%d").build());
|
|
|
consumer = mqClient.getConsumer(instanceId, topic, groupId, null);
|
|
|
|
|
|
- ackReceiptHandleQueue = new LinkedBlockingDeque<>();
|
|
|
+ BlockingQueue<String> ackReceiptHandleQueue = new LinkedBlockingDeque<>();
|
|
|
new Thread(() -> doConsume(ackReceiptHandleQueue)).start();
|
|
|
new Thread(() -> ackMessage(ackReceiptHandleQueue)).start();
|
|
|
}
|
|
@@ -120,10 +120,12 @@ public class EtlMQConsumer {
|
|
|
log.info("Receive message: {} from topic: {}, group: {}", message, topic, groupId);
|
|
|
CrawlerEtlParam param = JSONObject.parseObject(message.getMessageBodyString(), CrawlerEtlParam.class);
|
|
|
param.setMessageId(message.getMessageId());
|
|
|
+ param.setReceiptHandle(message.getReceiptHandle());
|
|
|
|
|
|
priorityPool.execute(new RunnablePriority(param, ackReceiptHandleQueue));
|
|
|
} else {
|
|
|
- log.warn("Priority pool queue size > {}! waiting for execute task.", priorityPool.getQueue().size());
|
|
|
+ log.warn("Priority pool queue size > {}! messageId {} will be retry. firstConsumeTime {}, ConsumedTimes {}",
|
|
|
+ priorityPool.getQueue().size(), message.getMessageId(), CommonUtils.milliToDateStr(message.getFirstConsumeTime()), message.getConsumedTimes());
|
|
|
}
|
|
|
});
|
|
|
} catch (Throwable e) {
|
|
@@ -133,9 +135,9 @@ public class EtlMQConsumer {
|
|
|
}
|
|
|
|
|
|
private void logPoolInfo() {
|
|
|
- log.info("Thread pool info TaskCount {}, CompletedTaskCount {}, ActiveCount {}, Queue size {}, Queue remainingCapacity {}",
|
|
|
+ log.info("Thread pool info TaskCount {}, CompletedTaskCount {}, ActiveCount {}, Queue size {}",
|
|
|
priorityPool.getTaskCount(), priorityPool.getCompletedTaskCount(), priorityPool.getActiveCount(),
|
|
|
- priorityPool.getQueue().size(), priorityPool.getQueue().remainingCapacity());
|
|
|
+ priorityPool.getQueue().size());
|
|
|
}
|
|
|
|
|
|
class RunnablePriority implements Runnable, Comparable<RunnablePriority> {
|
|
@@ -168,14 +170,21 @@ public class EtlMQConsumer {
|
|
|
public void run() {
|
|
|
try {
|
|
|
logPoolInfo();
|
|
|
- log.info("deal: {} priority: {}", param, getPriority());
|
|
|
+ log.info("begin deal {} priority {} ", param, getPriority());
|
|
|
+ // TODO: 模拟数据处理
|
|
|
+ TimeUnit.SECONDS.sleep(RandomUtils.nextInt(2, 20));
|
|
|
etlService.deal(param);
|
|
|
- log.info("deal: {} deal done", param);
|
|
|
- ackReceiptHandleQueue.put(param.getReceiptHandle());
|
|
|
+ log.info("deal done of {}", param);
|
|
|
logPoolInfo();
|
|
|
} catch (Exception e) {
|
|
|
log.error("deal {} error.", param, e);
|
|
|
}
|
|
|
+
|
|
|
+ try {
|
|
|
+ ackReceiptHandleQueue.put(param.getReceiptHandle());
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("put {} to ackReceiptHandleQueue error.", param.getReceiptHandle(), e);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
@Override
|