clusterserver.java

来自「RESIN 3.2 最新源码」· Java 代码 · 共 620 行

JAVA
620
字号
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT.  See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * *   Free Software Foundation, Inc. *   59 Temple Place, Suite 330 *   Boston, MA 02111-1307  USA * * @author Scott Ferguson */package com.caucho.server.cluster;import com.caucho.config.program.ConfigProgram;import com.caucho.config.program.ContainerProgram;import com.caucho.config.ConfigException;import com.caucho.config.types.Period;import com.caucho.lifecycle.StartLifecycleException;import com.caucho.management.server.ClusterServerMXBean;import com.caucho.server.http.HttpProtocol;import com.caucho.server.port.*;import com.caucho.server.resin.*;import com.caucho.util.L10N;import com.caucho.vfs.QServerSocket;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.logging.Logger;/** * Defines a member of the cluster, corresponds to <server> in the conf file. * * A {@link ServerConnector} obtained with {@link #getServerConnector} is used to actually * communicate with this ClusterServer when it is active in another instance of * Resin . */public class ClusterServer {  private static final L10N L = new L10N(ClusterServer.class);  private static final Logger log    = Logger.getLogger(ClusterServer.class.getName());  private static final long DEFAULT = 0xcafebabe;  private Cluster _cluster;  private Machine _machine;  private String _id = "";  private int _index;  private boolean _isDynamic;  private ClusterPort _clusterPort;  private ServerPool _serverPool;  private long _socketTimeout = 65000L;  private long _keepaliveTimeout = 15000L;    private long _loadBalanceIdleTime = DEFAULT;  private long _loadBalanceRecoverTime = 15000L;  private long _loadBalanceSocketTimeout = DEFAULT;  private long _loadBalanceWarmupTime = 60000L;    private long _loadBalanceConnectTimeout = 5000L;    private int _loadBalanceWeight = 100;  private ContainerProgram _serverProgram    = new ContainerProgram();  private ArrayList<Port> _ports = new ArrayList<Port>();  private boolean _isSelf;    private ClusterServerAdmin _admin = new ClusterServerAdmin(this);  public ClusterServer(Cluster cluster)  {    this(new Machine(cluster));  }  public ClusterServer(Machine machine)  {    _machine = machine;        _cluster = machine.getCluster();    _clusterPort = new ClusterPort(this);    _ports.add(_clusterPort);  }  public ClusterServer(Cluster cluster, boolean test)  {    _cluster = cluster;    _clusterPort = new ClusterPort(this);  }  /**   * Gets the server identifier.   */  public String getId()  {    return _id;  }  /**   * Sets the server identifier.   */  public void setId(String id)  {    _id = id;  }  /**   * Returns the cluster.   */  public Cluster getCluster()  {    return _cluster;  }  /**   * Returns the machine.   */  public Machine getMachine()  {    return _machine;  }  /**   * Returns the server index.   */  void setIndex(int index)  {    _index = index;  }  /**   * Returns the server index.   */  public int getIndex()  {    return _index;  }  /**   * Sets the keepalive timeout.   */  public void setKeepaliveTimeout(Period timeout)  {    _keepaliveTimeout = timeout.getPeriod();  }  /**   * Gets the keepalive timeout.   */  public long getKeepaliveTimeout()  {    return _keepaliveTimeout;  }  /**   * Sets the address   */  public void setAddress(String address)    throws UnknownHostException  {    _clusterPort.setAddress(address);  }  /**   * Sets true for backups   */  public void setBackup(boolean isBackup)  {    if (isBackup)      setLoadBalanceWeight(1);  }  /**   * True for a dynamic server   */  public void setDynamic(boolean isDynamic)  {    _isDynamic = isDynamic;  }  /**   * True for a dynamic server   */  public boolean isDynamic()  {    return _isDynamic;  }  /**   * Sets the loadBalance connection time.   */  public void setLoadBalanceConnectTimeout(Period period)  {    _loadBalanceConnectTimeout = period.getPeriod();  }  /**   * Gets the loadBalance connection time.   */  public long getLoadBalanceConnectTimeout()  {    return _loadBalanceConnectTimeout;  }  /**   * Sets the loadBalance socket time.   */  public void setLoadBalanceSocketTimeout(Period period)  {    _loadBalanceSocketTimeout = period.getPeriod();  }  /**   * Gets the loadBalance socket time.   */  public long getLoadBalanceSocketTimeout()  {    if (_loadBalanceSocketTimeout != DEFAULT)      return _loadBalanceSocketTimeout;    else      return _socketTimeout + 600000L;  }  /**   * Sets the loadBalance max-idle-time.   */  public void setLoadBalanceIdleTime(Period period)  {    _loadBalanceIdleTime = period.getPeriod();  }  /**   * Sets the loadBalance idle-time.   */  public long getLoadBalanceIdleTime()  {    if (_loadBalanceIdleTime != DEFAULT)      return _loadBalanceIdleTime;    else if (_keepaliveTimeout < 15000L)      return _keepaliveTimeout - 5000L;    else      return _keepaliveTimeout - 10000L;  }  /**   * Sets the loadBalance fail-recover-time.   */  public void setLoadBalanceRecoverTime(Period period)  {    _loadBalanceRecoverTime = period.getPeriod();  }  /**   * Gets the loadBalance fail-recover-time.   */  public long getLoadBalanceRecoverTime()  {    return _loadBalanceRecoverTime;  }  /**   * Sets the loadBalance read/write timeout   */  public void setSocketTimeout(Period period)  {    _socketTimeout = period.getPeriod();  }  /**   * Gets the loadBalance read/write timeout   */  public long getSocketTimeout()  {    return _socketTimeout;  }  /**   * Sets the loadBalance warmup time   */  public void setLoadBalanceWarmupTime(Period period)  {    _loadBalanceWarmupTime = period.getPeriod();  }  /**   * Gets the loadBalance warmup time   */  public long getLoadBalanceWarmupTime()  {    return _loadBalanceWarmupTime;  }  /**   * Sets the loadBalance weight   */  public void setLoadBalanceWeight(int weight)  {    _loadBalanceWeight = weight;  }  /**   * Gets the loadBalance weight   */  public int getLoadBalanceWeight()  {    return _loadBalanceWeight;  }  /**   * Arguments on boot   */  public void addJavaExe(String args)  {  }  /**   * Arguments on boot   */  public void addJvmArg(String args)  {  }  /**   * Arguments on boot   */  public void addJvmClasspath(String args)  {  }  /**   * Arguments on boot   */  public void addWatchdogArg(String args)  {  }  /**   * Arguments on boot   */  public void addWatchdogJvmArg(String args)  {  }  /**   * Arguments on boot   */  public void addWatchdogPassword(String args)  {  }  /**   * Arguments on boot   */  public void addWatchdogPort(int port)  {  }  /**   * Arguments on boot   */  public void addWatchdogAddress(String addr)  {  }  /**   * Sets a port.   */  public void setPort(int port)  {    _clusterPort.setPort(port);  }  /**   * Gets the port.   */  public int getPort()  {    return _clusterPort.getPort();  }  /**   * Adds a http.   */  public Port createHttp()    throws ConfigException  {    Port port = new Port(this);        HttpProtocol protocol = new HttpProtocol();    protocol.setParent(port);    port.setProtocol(protocol);    addProtocolPort(port);    return port;  }  /**   * Adds a custom-protocol port.   */  public Port createProtocol()    throws ConfigException  {    ProtocolPort port = new ProtocolPort(this);    _ports.add(port);    return port;  }  void addProtocolPort(Port port)  {    _ports.add(port);  }  /**   * Pre-binding of ports.   */  public void bind(String address, int port, QServerSocket ss)    throws Exception  {    if ("null".equals(address))      address = null;    for (int i = 0; i < _ports.size(); i++) {      Port serverPort = _ports.get(i);      if (port != serverPort.getPort())	continue;      if ((address == null) != (serverPort.getAddress() == null))	continue;      else if (address == null || address.equals(serverPort.getAddress())) {	serverPort.bind(ss);	return;      }    }    throw new IllegalStateException(L.l("No matching port for {0}:{1}",					address, port));  }  /**   * Sets the user name.   */  public void setUserName(String userName)  {  }  /**   * Sets the group name.   */  public void setGroupName(String groupName)  {  }  /**   * Returns the ports.   */  public ArrayList<Port> getPorts()  {    return _ports;  }  /**   * Sets the ClusterPort.   */  public ClusterPort createClusterPort()  {    return _clusterPort;  }  /**   * Sets the ClusterPort.   */  public ClusterPort getClusterPort()  {    return _clusterPort;  }  /**   * Returns true for the self server   */  public boolean isSelf()  {    return _isSelf;  }  /**   * Returns true for secure.   */  public boolean isSSL()  {    return getClusterPort().isSSL();  }  /**   * Returns the server connector.   */  public ServerPool getServerPool()  {    if (_cluster.getSelfServer() != this)      return _serverPool;    else      return null;  }  /**   * Adds a program.   */  public void addBuilderProgram(ConfigProgram program)  {    _serverProgram.addProgram(program);  }  /**   * Adds a program.   */  public ConfigProgram getServerProgram()  {    return _serverProgram;  }    /**   * Initialize   */  public void init()    throws Exception  {    _clusterPort.init();    if (_cluster != null) {      _serverPool = new ServerPool(_cluster.getServerId(), this);      _serverPool.init();      _admin.register();    }  }  /**   * Starts the server.   */  public Server startServer()    throws StartLifecycleException  {    _isSelf = true;        return _cluster.startServer(this);  }  /**   * Generate the primary, secondary, tertiary, returning the value encoded   * in a long.   */  public long generateBackupCode()  {    return _cluster.generateBackupCode(_index);  }  /**   * Adds the primary/backup/third digits to the id.   */  public void generateBackupCode(StringBuilder cb)  {    _cluster.generateBackupCode(cb, generateBackupCode());  }  //  // admin  //  /**   * Returns the admin object   */  public ClusterServerMXBean getAdmin()  {    return _admin;  }  /**   * Close any ports.   */  public void close()  {    if (_serverPool != null)      _serverPool.close();  }  @Override  public String toString()  {    return getClass().getSimpleName() + "[id=" + getId() + "]";  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?