package com.github.ltsopensource.core.cluster; import com.github.ltsopensource.core.constant.Constants; import com.github.ltsopensource.core.json.JSON; import java.io.Serializable; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * @author Robert HG (254963746@qq.com) on 8/20/14. * 任务节点配置 */ public class Config implements Serializable { private static final long serialVersionUID = -8283382582968938472L; // 节点是否可用 private boolean available = true; // 应用节点组 private String nodeGroup; // 唯一标识 private String identity; // 工作线程, 目前只对 TaskTracker 有效 private int workThreads; // 节点类型 private NodeType nodeType; // 注册中心 地址 private String registryAddress; // 远程连接超时时间 private int invokeTimeoutMillis; // 监听端口 private int listenPort; private String ip; // 任务信息存储路径(譬如TaskTracker反馈任务信息给JobTracker, JobTracker down掉了, 那么存储下来等待JobTracker可用时再发送) private String dataPath; // 集群名字 private String clusterName; private volatile transient Map<String, Number> numbers; private final Map<String, String> parameters = new HashMap<String, String>(); // 内部使用 private final Map<String, Object> internalData = new ConcurrentHashMap<String, Object>(); public String getClusterName() { return clusterName; } public void setClusterName(String clusterName) { this.clusterName = clusterName; } public String getNodeGroup() { return nodeGroup; } public void setNodeGroup(String nodeGroup) { this.nodeGroup = nodeGroup; } public String getIdentity() { return identity; } public void setIdentity(String identity) { this.identity = identity; } public int getWorkThreads() { return workThreads; } public void setWorkThreads(int workThreads) { this.workThreads = workThreads; } public NodeType getNodeType() { return nodeType; } public void setNodeType(NodeType nodeType) { this.nodeType = nodeType; } public String getRegistryAddress() { return registryAddress; } public void setRegistryAddress(String registryAddress) { this.registryAddress = registryAddress; } public int getInvokeTimeoutMillis() { return invokeTimeoutMillis; } public void setInvokeTimeoutMillis(int invokeTimeoutMillis) { this.invokeTimeoutMillis = invokeTimeoutMillis; } public int getListenPort() { return listenPort; } public void setListenPort(int listenPort) { this.listenPort = listenPort; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getDataPath() { return dataPath; } public void setDataPath(String dataPath) { this.dataPath = dataPath; } public boolean isAvailable() { return available; } public void setAvailable(boolean available) { this.available = available; } public void setParameter(String key, String value) { parameters.put(key, value); } public String getParameter(String key) { return parameters.get(key); } public String getParameter(String key, String defaultValue) { String value = parameters.get(key); if (value == null) { return defaultValue; } return value; } public Map<String, String> getParameters() { return parameters; } private Map<String, Number> getNumbers() { if (numbers == null) { // 允许并发重复创建 numbers = new ConcurrentHashMap<String, Number>(); } return numbers; } public boolean getParameter(String key, boolean defaultValue) { String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } return Boolean.parseBoolean(value); } public int getParameter(String key, int defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.intValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } int i = Integer.parseInt(value); getNumbers().put(key, i); return i; } public String[] getParameter(String key, String[] defaultValue) { String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } return Constants.COMMA_SPLIT_PATTERN.split(value); } public double getParameter(String key, double defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.doubleValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } double d = Double.parseDouble(value); getNumbers().put(key, d); return d; } public float getParameter(String key, float defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.floatValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } float f = Float.parseFloat(value); getNumbers().put(key, f); return f; } public long getParameter(String key, long defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.longValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } long l = Long.parseLong(value); getNumbers().put(key, l); return l; } public short getParameter(String key, short defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.shortValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } short s = Short.parseShort(value); getNumbers().put(key, s); return s; } public byte getParameter(String key, byte defaultValue) { Number n = getNumbers().get(key); if (n != null) { return n.byteValue(); } String value = getParameter(key); if (value == null || value.length() == 0) { return defaultValue; } byte b = Byte.parseByte(value); getNumbers().put(key, b); return b; } @SuppressWarnings("unchecked") public <T> T getInternalData(String key, T defaultValue) { Object obj = internalData.get(key); if (obj == null) { return defaultValue; } return (T) obj; } public <T> T getInternalData(String key) { return getInternalData(key, null); } public void setInternalData(String key, Object value) { internalData.put(key, value); } @Override public String toString() { return JSON.toJSONString(this); } }