package com.github.ltsopensource.core.monitor; import com.github.ltsopensource.core.domain.monitor.MData; import com.github.ltsopensource.core.logger.Logger; import com.github.ltsopensource.core.logger.LoggerFactory; import org.junit.Test; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.concurrent.PriorityBlockingQueue; /** * @author Robert HG (254963746@qq.com) on 7/13/16. */ public class MStatReportWorkerTest { protected final Logger LOGGER = LoggerFactory.getLogger(MStatReportWorker.class); private PriorityBlockingQueue<MData> queue = new PriorityBlockingQueue<MData>(16, new Comparator<MData>() { @Override public int compare(MData o1, MData o2) { return o1.getTimestamp().compareTo(o2.getTimestamp()); } }); private final static int MAX_RETRY_RETAIN = 30; private final static int BATCH_REPORT_SIZE = 10; private volatile boolean running = false; @Test public void testReport() { for (int i = 0; i < 100; i++) { MData mData = new MData(); mData.setTimestamp(Long.valueOf(i)); report(mData); } } private void report(MData mData) { int size = queue.size(); if (size >= MAX_RETRY_RETAIN) { int needRemoveSize = size - (MAX_RETRY_RETAIN - 1); for (int i = 0; i < needRemoveSize; i++) { queue.poll(); } } queue.add(mData); while (queue.size() > 0) { List<MData> list = new ArrayList<MData>(); queue.drainTo(list, BATCH_REPORT_SIZE); boolean success = false; try { if (sendReq()) { success = true; } } catch (Throwable t) { LOGGER.warn("Report monitor data Error : " + t.getMessage(), t); } finally { if (!success) { // 放回去 queue.addAll(list); } } if (!success) { // 停止while break; } } } private boolean sendReq() { return false; } }