package com.alibaba.rocketmq.namesrv.sync; import static com.alibaba.rocketmq.common.MixAll.Localhost; import static com.alibaba.rocketmq.namesrv.common.Result.SUCCESS; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.alibaba.rocketmq.common.MixAll; import com.alibaba.rocketmq.namesrv.common.Result; /** * * @author lansheng.zj@taobao.com * * @param <R> * ����ֵ���� * */ public class FutureGroup<R> { private static final Logger log = LoggerFactory.getLogger(MixAll.NamesrvLoggerName); private CountDownLatch latch; private Map<String, Future<R>> resultMap; private Set<String> keys; public FutureGroup(CountDownLatch latch, Set<String> keys) { this.latch = latch; this.keys = keys; resultMap = new HashMap<String, Future<R>>(); } public void addResult(String key, Future<R> r) { resultMap.put(key, r); } public Result await(long timeout) { try { if (latch.await(timeout, TimeUnit.MILLISECONDS)) return SUCCESS; else return new Result(false, detailInfo()); } catch (Exception e) { log.error("FutureGroup await error.", e); return new Result(false, Localhost + " system error " + e.getMessage()); } } public Set<String> getKeys() { return keys; } public void setKeys(Set<String> keys) { this.keys = keys; } public Map<String, Future<R>> getResultMap() { return resultMap; } public String detailInfo() { StringBuilder info = new StringBuilder(); for (String key : keys) { info.append(key).append(":").append(resultMap.get(key)).append("\n"); } return info.toString(); } }