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 + -
显示快捷键?