package com.alibaba.jstorm.daemon.nimbus.metric.uploader; import com.alibaba.jstorm.client.ConfigExtension; import com.alibaba.jstorm.config.Refreshable; import com.alibaba.jstorm.config.RefreshableComponents; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * @author wange * @since 16/7/7 */ public abstract class BaseMetricUploaderWithFlowControl implements MetricUploader, Refreshable { private final Logger logger = LoggerFactory.getLogger(getClass()); private volatile int maxConcurrentUploadingNum; private final AtomicInteger currentUploadingNum = new AtomicInteger(0); public BaseMetricUploaderWithFlowControl() { RefreshableComponents.registerRefreshable(this); } public void setMaxConcurrentUploadingNum(int maxConcurrentUploadingNum) { this.maxConcurrentUploadingNum = maxConcurrentUploadingNum; } public void incrUploadingNum() { int num = currentUploadingNum.incrementAndGet(); logger.debug("incr, UploadingNum:{}", num); } public void decrUploadingNum() { int num = currentUploadingNum.decrementAndGet(); logger.debug("decr, UploadingNum:{}", num); } public synchronized boolean syncToUpload() { if (currentUploadingNum.get() < maxConcurrentUploadingNum) { incrUploadingNum(); return true; } return false; } @Override public void refresh(Map conf) { int maxUploadingNum = ConfigExtension.getMaxConcurrentUploadingNum(conf); if (maxUploadingNum > 0 && maxUploadingNum != this.maxConcurrentUploadingNum) { this.maxConcurrentUploadingNum = maxUploadingNum; } } }