cluster.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 1,289 行 · 第 1/2 页
JAVA
1,289 行
return _serverIdLocal.get(); } /** * Returns the JMX object name. */ public ObjectName getObjectName() { return _objectName == null ? null : _objectName; } /** * Returns the server corresponding to the current server-id. */ public ClusterServer getSelfServer() { _serverId = _serverIdLocal.get(); return getServer(_serverId); } /** * Returns the server list. */ public ClusterServer []getServerList() { return _serverArray; } /** * Returns the machine list. */ public ArrayList<Machine> getMachineList() { return _machineList; } /** * Returns the server in the cluster with the given server-id. */ public ClusterServer getServer(String serverId) { for (int i = 0; i < _serverList.size(); i++) { ClusterServer server = _serverList.get(i); if (server != null && server.getId().equals(serverId)) return server; } return null; } /** * Returns the server with the matching index. */ public ClusterServer getServer(int index) { for (int i = 0; i < _serverList.size(); i++) { ClusterServer server = _serverList.get(i); if (server != null && server.getIndex() == index) return server; } return null; } /** * Returns the matching ports. */ public ArrayList<ClusterPort> getServerPorts(String serverId) { ArrayList<ClusterPort> ports = new ArrayList<ClusterPort>(); for (int i = 0; i < _serverList.size(); i++) { ClusterServer server = _serverList.get(i); if (server != null) { ClusterPort port = server.getClusterPort(); if (port.getServerId().equals(serverId)) ports.add(port); } } return ports; } EnvironmentMXBean getEnvironmentAdmin() { return _classLoader.getAdmin(); } /** * Starts the server. */ Server startServer(ClusterServer clusterServer) throws StartLifecycleException { synchronized (this) { if (_server != null) return _server; Server server = createResinServer(clusterServer); _serverProgram.configure(server); _server = server; return server; } } protected Server createResinServer(ClusterServer clusterServer) { return new Server(clusterServer); } // // persistent store support // /** * Generate the primary, secondary, tertiary, returning the value encoded * in a long. */ public long generateBackupCode(int index) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; ArrayList<Machine> machineList = getMachineList(); int machineLength = machineList.size(); long backupCode = index; long backupLength = srunLength; if (backupLength < 3) backupLength = 3; int backup; if (srunLength <= 1) { backup = 0; backupCode |= 1L << 16; } else if (srunLength == 2) { backup = 0; backupCode |= ((index + 1L) % 2) << 16; } else if (machineLength == 1) { int sublen = srunLength - 1; if (sublen > 7) sublen = 7; backup = RandomUtil.nextInt(sublen); backupCode |= ((index + backup + 1L) % backupLength) << 16; } else { ClusterServer primaryServer = srunList[index]; int machineIndex = primaryServer.getMachine().getIndex(); int sublen = machineLength - 1; if (sublen > 7) sublen = 7; int backupMachine = ((machineIndex + RandomUtil.nextInt(sublen) + 1) % machineLength); Machine machine = machineList.get(backupMachine); ArrayList<ClusterServer> serverList = machine.getServerList(); ClusterServer server; if (serverList.size() > 1) server = serverList.get(RandomUtil.nextInt(serverList.size())); else server = serverList.get(0); backup = (int) (server.getIndex() - index + srunLength) % srunLength - 1; backupCode |= ((index + backup + 1L) % backupLength) << 16; } if (srunLength <= 2) backupCode |= 2L << 32; else { int sublen = srunLength - 2; if (sublen > 6) sublen = 6; int third = RandomUtil.nextInt(sublen); if (backup <= third) third += 1; backupCode |= ((index + third + 1) % backupLength) << 32; } return backupCode; } /** * Adds the primary/backup/third digits to the id. */ public void generateBackupCode(StringBuilder cb, long backupCode) { addDigit(cb, (int) (backupCode & 0xffff)); addDigit(cb, (int) ((backupCode >> 16) & 0xffff)); addDigit(cb, (int) ((backupCode >> 32) & 0xffff)); } public void generateBackup(StringBuilder sb, int index) { generateBackupCode(sb, generateBackupCode(index)); } /** * Returns the primary server. */ public ClusterServer getPrimary(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 0)); } else { int d1 = decode(id.charAt(offset + 0)); int d2 = decode(id.charAt(offset + 1)); index = d1 * 64 + d2; } if (index < srunLength) return srunList[index]; else return null; } /** * Returns the secondary server. */ public ClusterServer getSecondary(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 1)); } else { int d1 = decode(id.charAt(offset + 2)); int d2 = decode(id.charAt(offset + 3)); index = d1 * 64 + d2; } if (index < srunLength) return srunList[index]; else return null; } /** * Returns the tertiary server. */ public ClusterServer getTertiary(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 2)); } else { int d1 = decode(id.charAt(offset + 4)); int d2 = decode(id.charAt(offset + 5)); index = d1 * 64 + d2; } if (index < srunLength) return srunList[index]; else return null; } /** * Returns the primary server. */ public int getPrimaryIndex(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 0)); } else { int d1 = decode(id.charAt(offset + 0)); int d2 = decode(id.charAt(offset + 1)); index = d1 * 64 + d2; } return index; } /** * Returns the secondary server. */ public int getSecondaryIndex(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 1)); } else { int d1 = decode(id.charAt(offset + 2)); int d2 = decode(id.charAt(offset + 3)); index = d1 * 64 + d2; } return index; } /** * Returns the tertiary server. */ public int getTertiaryIndex(String id, int offset) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; int index = 0; if (srunLength <= 64) { index = decode(id.charAt(offset + 2)); } else { int d1 = decode(id.charAt(offset + 4)); int d2 = decode(id.charAt(offset + 5)); index = d1 * 64 + d2; } return index; } private void addDigit(StringBuilder cb, int digit) { ClusterServer []srunList = getServerList(); int srunLength = srunList.length; if (srunLength <= 64) cb.append(convert(digit)); else { cb.append(convert(digit / 64)); cb.append(convert(digit)); } } /** * Handles the case where a class loader has completed initialization */ public void classLoaderInit(DynamicClassLoader loader) { } /** * Handles the case where a class loader is dropped. */ public void classLoaderDestroy(DynamicClassLoader loader) { } /** * Start any work in notifying other members in the cluster * that the server is active. */ public void startRemote() { } public void startPersistentStore() { try { if (_clusterStore != null) _clusterStore.start(); } catch (Exception e) { log.log(Level.WARNING, e.toString(), e); } } public void startClusterUpdate() { try { if (_clusterStore != null) _clusterStore.startUpdate(); } catch (Exception e) { log.log(Level.WARNING, e.toString(), e); } } /** * Handles the case where the environment is configured (after init). */ public void environmentConfigure(EnvironmentClassLoader loader) { } /** * Handles the case where the environment is starting (after init). */ public void environmentBind(EnvironmentClassLoader loader) { } /** * Handles the case where the environment is starting (after init). */ public void environmentStart(EnvironmentClassLoader loader) { } /** * Handles the case where the environment is stopping */ public void environmentStop(EnvironmentClassLoader loader) { try { close(); } catch (Throwable e) { log.log(Level.WARNING, e.toString(), e); } } /** * Closes the cluster. */ public void close() { synchronized (this) { if (_isClosed) return; _isClosed = true; } for (int i = 0; i < _serverList.size(); i++) { ClusterServer server = _serverList.get(i); try { if (server != null) server.close(); } catch (Throwable e) { log.log(Level.WARNING, e.toString(), e); } } } @Override public String toString() { return getClass().getSimpleName() + "[" + _id + "]"; } /** * Converts an integer to a printable character */ private static char convert(long code) { code = code & 0x3f; if (code < 26) return (char) ('a' + code); else if (code < 52) return (char) ('A' + code - 26); else if (code < 62) return (char) ('0' + code - 52); else if (code == 62) return '_'; else return '-'; } public static int decode(int code) { return DECODE[code & 0x7f]; } /** * EL variables */ public class Var { /** * Returns the resin.id */ public String getId() { return _id; } /** * Returns the root directory. * * @return root directory */ public Path getRoot() { return Cluster.this.getRootDirectory(); } /** * Returns the root directory. * * @return root directory */ public Path getRootDir() { return getRoot(); } /** * Returns the root directory. * * @return root directory */ public Path getRootDirectory() { return getRoot(); } } public class ServerVar { private final ClusterServer _server; public ServerVar(ClusterServer server) { _server = server; } public String getId() { return _server.getId(); } private int getPort(Port port) { if (port == null) return 0; return port.getPort(); } private String getAddress(Port port) { if (port == null) return null; String address = port.getAddress(); if (address == null || address.length() == 0) address = "INADDR_ANY"; return address; } private Port getFirstPort(String protocol, boolean isSSL) { if (_server.getPorts() == null) return null; for (Port port : _server.getPorts()) { if (protocol.equals(port.getProtocolName()) && (port.isSSL() == isSSL)) return port; } return null; } public String getAddress() { return getAddress(_server.getClusterPort()); } public int getPort() { return getPort(_server.getClusterPort()); } public String getHttpAddress() { return getAddress(getFirstPort("http", false)); } public int getHttpPort() { return getPort(getFirstPort("http", false)); } public String getHttpsAddress() { return getAddress(getFirstPort("http", true)); } public int getHttpsPort() { return getPort(getFirstPort("http", true)); } /** * @deprecated backwards compat. */ public Path getRoot() { Resin resin = Resin.getLocal(); return resin == null ? Vfs.getPwd() : resin.getRootDirectory(); } } static { DECODE = new int[128]; for (int i = 0; i < 64; i++) DECODE[(int) convert(i)] = i; }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?