package com.dianping.puma.api.impl; import com.dianping.puma.api.PumaServerMonitor; import com.dianping.puma.api.PumaServerRouter; import java.util.List; public class RoundRobinPumaServerRouter implements PumaServerRouter { protected PumaServerMonitor monitor; private boolean inited = false; private volatile List<String> servers; private int index; public RoundRobinPumaServerRouter(PumaServerMonitor monitor) { this.monitor = monitor; } @Override public String next() { if (!inited) { init(); inited = true; } if (servers == null || servers.size() == 0) { return null; } if (index >= servers.size()) { index = index - servers.size(); } return servers.get(index++); } @Override public boolean exist(String server) { if (!inited) { init(); inited = true; } return servers != null && servers.contains(server); } protected void init() { servers = monitor.get(); PumaServerMonitor.PumaServerMonitorListener listener = new PumaServerMonitor.PumaServerMonitorListener() { @Override public void onChange(List<String> servers) { RoundRobinPumaServerRouter.this.servers = servers; } }; monitor.addListener(listener); } }