package com.networknt.consul; import com.networknt.consul.client.ConsulClient; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; /** * @author zhanglei28 * @Description MockConsulClient */ public class MockConsulClient implements ConsulClient { // save mock service heart beat private ConcurrentHashMap<String, AtomicLong> checkPassTimesMap = new ConcurrentHashMap<String, AtomicLong>(); // registered service and service status, true is available, false unavailable private ConcurrentHashMap<String, Boolean> serviceStatus = new ConcurrentHashMap<String, Boolean>(); // registered serviceId and service relationship private ConcurrentHashMap<String, ConsulService> services = new ConcurrentHashMap<String, ConsulService>(); // KVValue private ConcurrentHashMap<String, String> KVValues = new ConcurrentHashMap<String, String>(); private int mockServiceNum = 10; private long mockIndex = 10; String host; int port; public MockConsulClient(String host, int port) { this.host = host; this.port = port; } @Override public void checkPass(String serviceid) { AtomicLong times = checkPassTimesMap.get(serviceid); if (times == null) { checkPassTimesMap.putIfAbsent(serviceid, new AtomicLong()); times = checkPassTimesMap.get(serviceid); } times.getAndIncrement(); serviceStatus.put(serviceid, true); } @Override public void checkFail(String serviceid) { serviceStatus.put(serviceid, false); } @Override public void registerService(ConsulService service) { serviceStatus.put(service.getId(), false); services.put(service.getId(), service); } @Override public void unregisterService(String serviceid) { serviceStatus.remove(serviceid); services.remove(serviceid); } @Override public ConsulResponse<List<ConsulService>> lookupHealthService(String serviceName, long lastConsulIndex) { ConsulResponse<List<ConsulService>> res = new ConsulResponse<List<ConsulService>>(); res.setConsulIndex(lastConsulIndex + 1); res.setConsulKnownLeader(true); res.setConsulLastContact(0L); List<ConsulService> list = new ArrayList<ConsulService>(); for (Map.Entry<String, Boolean> entry : serviceStatus.entrySet()) { if (entry.getValue()) { list.add(services.get(entry.getKey())); } } res.setValue(list); return res; } @Override public String lookupCommand(String group) { String command = KVValues.get(group); if (command == null) { command = ""; } return command; } public long getCheckPassTimes(String serviceid) { AtomicLong times = checkPassTimesMap.get(serviceid); if (times == null) { return 0; } return times.get(); } public int getMockServiceNum() { return mockServiceNum; } public void setMockServiceNum(int mockServiceNum) { this.mockServiceNum = mockServiceNum; } public boolean isRegistered(String serviceid) { return serviceStatus.containsKey(serviceid); } public boolean isWorking(String serviceid) { return serviceStatus.get(serviceid); } public void removeService(String serviceid) { serviceStatus.remove(serviceid); services.remove(serviceid); } public long getMockIndex() { return mockIndex; } public void setKVValue(String key, String value) { KVValues.put(key, value); } public void removeKVValue(String key) { KVValues.remove(key); } }