Utilización de la API de servidor incorporado para iniciar y detener servidores

Con WebSphere eXtreme Scale, puede utilizar una API programática para gestionar el ciclo de vida de servidores y contenedores incorporados. Puede configurar a través de programas el servidor con cualquiera de las opciones que también puede configurar con las opciones de la línea de mandatos o las propiedades de servidor basadas en archivo. Puede configurar el servidor incorporado para que sea un servidor de contenedor, un servicio de catálogo, o ambos.

Antes de empezar

Debe tener un método para ejecutar el código desde una Máquina virtual Java ya existente. Las clases de eXtreme Scale deben estar disponibles a través del árbol del cargador de clases.

Acerca de esta tarea

Puede ejecutar muchas tareas de administración con la API Administration. Un uso común de la API es su uso como servidor interno para almacenar el estado de la aplicación web. El servidor web puede iniciar un servidor WebSphere eXtreme Scale incorporado, realizar informes del servidor de contenedor en el servicio de catálogo y después añadirlo como un miembro de una cuadrícula distribuida mayor. Este uso puede proporcionar escalabilidad y alta disponibilidad en un almacén de datos que de lo contrario es volátil.

Puede controlar mediante programación el ciclo de vida completo de un servidor eXtreme Scale incorporado. Los ejemplos son lo más genéricos posibles y sólo muestran códigos de ejemplo de código directo para los pasos descritos.

Procedimiento

  1. Obtenga el objeto ServerProperties desde la clase ServerFactory y configure las opciones necesarias. Si desea más información sobre la interfaz ServerProperties, consulte Interfaz ServerProperties.
    Cada servidor eXtreme Scale tiene un conjunto de propiedades configurables. Cuando un servidor se inicia desde la línea de mandatos, estas propiedades toman los valores predeterminado, pero puede alterar temporalmente varias propiedades proporcionando un origen o archivo externo. En el ámbito incorporado, puede establecer directamente las propiedades con un objeto ServerProperties. Debe establecer estas propiedades antes de obtener una instancia de servidor desde la clase ServerFactory. El siguiente fragmento de código obtiene un objeto ServerProperties, establece el campo CatalogServiceBootStrap e inicializa varios valores de servidor opcionales. Consulte la documentación de la API para ver una lista de los valores configurables.
    ServerProperties props = ServerFactory.getServerProperties();
    props.setCatalogServiceBootstrap("host:port"); // necesario para conectarse a un servicio
                                                   // de catálogo específico
    props.setServerName("ServerOne"); // name server
    props.setTraceSpecification("com.ibm.ws.objectgrid=all=enabled"); // Establece la espec. de rastreo
  2. Si desea que el servidor sera un servicio de catálogo, obtenga el objeto CatalogServerProperties.

    Si desea más información sobre la interfaz CatalogServerProperties, consulte Interfaz CatalogServerProperties.

    Todos los servidores incorporados pueden ser un servicio de catálogo, un servidor de contenedor, o ambos, un servidor de contenedor y un servicio de catálogo. El siguiente ejemplo obtiene el objeto CatalogServerProperties, habilita la opción del servicio de catálogo y configura distintos valores de servicio de catálogo.
    CatalogServerProperties catalogProps = ServerFactory.getCatalogProperties();
    catalogProps.setCatalogServer(true); // false de forma predeterminada, es necesario establecerlo
                                         // como un servicio de catálogo
    catalogProps.setQuorum(true); // habilitar / inhabilitar el quórum
  3. Obtenga una instancia de Server desde la clase ServerFactory. La instancia de Server es un singleton con un ámbito de proceso que es responsable de gestionar la pertenencia de la cuadrícula. Después de que se haya creado una instancia, este proceso se conecta y está muy disponible con los otros servidores de la cuadrícula.

    Si desea más información sobre la interfaz Server, consulte Interfaz Server. Si desea más información sobre la clase ServerFactory, consulte Clase ServerFactory.

    El siguiente ejemplo muestra cómo crear la instancia de Server:
     Server server = ServerFactory.getInstance();
    Mediante la revisión del ejemplo anterior, la clase ServerFactory proporciona un método estático que devuelve una instancia de Server. La clase ServerFactory tiene como objetivo ser la única interfaz para obtener una instancia de Server. Por lo tanto, la clase garantiza que la instancia es un singleton, o una instancia para cada JVM o cargador de clases aislado. El método getInstance inicializa la instancia de Server. Debe configurar todas las propiedades de servidor antes de inicializar la instancia. La clase Server es responsable de crear las nuevas instancias de Container. Puede utilizar ambas clases, ServerFactory y Server, para gestionar el ciclo de vida de la instancia de Server incorporada.

    Si desea más información sobre la interfaz Container, consulte Interfaz Container.

  4. Inicie una instancia de Container utilizando la instancia de Server.
    Antes de que los fragmentos se puedan colocar en un servidor incorporado, debe crear un contenedor en el servidor. La interfaz Server tiene un método createContainer que adopta un argumento DeploymentPolicy. El siguiente ejemplo utiliza la instancia del servidor que ha obtenido para crear un contenedor utilizando un archivo DeploymentPolicy creado. Tenga en cuenta que los contenedores requieren un cargador de clases que tiene los binarios de aplicaciones disponibles para la serialización. Puede hacer que estos binarios estén disponibles llamando al método createContainer con el cargador de clases del contexto Thread establecido en el cargador de clases que desee utilizar.
    Política de despliegue = DeploymentPolicyFactory.createDeploymentPolicy(new
    URL("file://urltodeployment.xml"),
    	new URL("file://urltoobjectgrid.xml"));
    Container container = server.createContainer(policy);
  5. Eliminar y borrar un contenedor.

    Puede eliminar y borrar un servidor de contenedor utilizando el método teardown en ejecución en la instancia de Container obtenida.  Ejecutar el método teardown en un contenedor correctamente borra el contenedor y elimina el contenedor del servidor incorporado.  

    El proceso de limpieza del contenedor incluye el movimiento y la destrucción de todos los fragmentos que se han colocado dentro de dicho contenedor. Cada servidor puede contener muchos contenedores y fragmentos. La limpieza de un contenedor no afecta al ciclo de vida de la instancia padre de Server. El siguiente ejemplo demuestra cómo ejecutar el método teardown en un servidor. El método teardown se ha hecho disponible a través de la interfaz ContainerMBean. Mediante el uso de la interfaz ContainerMBean, si deja de tener acceso mediante programa a este contenedor, puede seguir eliminando y limpiando el contenedor con su MBean. También existe un método terminate en la interfaz Container, no utilice este método, a menos que sea absolutamente necesario. Este método es más potente y no coordina el movimiento y la limpieza de fragmentos apropiados.
    container.teardown();
  6. Detenga el servidor incorporado.
    Cuando detenga un servidor incorporado, también puede detener los contenedores y los fragmentos que se ejecutan en el servidor. Cuando detenga un servidor incorporado, debe limpiar todas las conexiones abiertas o mover o destruir todos los fragmentos. El siguiente ejemplo demuestra cómo detener un servidor y cómo utilizar el método waitFor en la interfaz Server para asegurarse de que la instancia de Server se termina por completo. De forma similar al ejemplo del contenedor, el método stopServer pasa a estar disponible a través de la interfaz ServerMBean. Con esta interfaz, puede detener un servidor con el bean gestionado (MBean) correspondiente.
    ServerFactory.stopServer();  // Utiliza la fábrica para matar el proceso singleton de Server
     // o
    server.stopServer(); // Utiliza directamente la instancia de Server
    server.waitFor(); // Se devuelve este valor cuando el servidor ha completado correctamente
    sus procedimientos de conclusión. 
    Ejemplo de código completo:
     import java.net.MalformedURLException;
    import java.net.URL;
    
    import com.ibm.websphere.objectgrid.ObjectGridException;
    import com.ibm.websphere.objectgrid.deployment.DeploymentPolicy;
    import com.ibm.websphere.objectgrid.deployment.DeploymentPolicyFactory;
    import com.ibm.websphere.objectgrid.server.Container;
    import com.ibm.websphere.objectgrid.server.Server;
    import com.ibm.websphere.objectgrid.server.ServerFactory;
    import com.ibm.websphere.objectgrid.server.ServerProperties;
    
    public class ServerFactoryTest {
    
        public static void main(String[] args) {
    
            try {
    
                ServerProperties props = ServerFactory.getServerProperties();
                props.setCatalogServiceBootstrap("catalogservice-hostname:catalogservice-port");
                props.setServerName("ServerOne"); // name server
                props.setTraceSpecification("com.ibm.ws.objectgrid=all=enabled"); // TraceSpec
    
                /*
                 * En la mayoría de los casos, el servidor actuará sólo como un servidor de contenedor
                 * y se conectará a un servicio de catálogo externo. Este es un método más disponible
                 * de realizar acciones. La siguiente excepción de código comentada
                 * permitirá que este Server sea un servicio de catálogo.
                 *
                 *
                 * CatalogServerProperties catalogProps =
                 * ServerFactory.getCatalogProperties();
                 * catalogProps.setCatalogServer(true); // habilitar el servicio de catálogo
                 * catalogProps.setQuorum(true); // habilitar quórum
                 */
    
                Server server = ServerFactory.getInstance();
    
                DeploymentPolicy policy = DeploymentPolicyFactory.createDeploymentPolicy
    					(new URL("url to deployment xml"),  new URL("url to objectgrid xml file"));
                Container container = server.createContainer(policy);
                
                /*
                 * Ahora el fragmento se colocará en este contenedor, si se cumplen los
                 * requisitos de despliegue.
                 * Esto engloba la creación del contenedor y del servidor incorporados.
                 *
                 * Las líneas siguientes simplemente demostrarán la llamada a métodos de limpieza
                 */
                
                container.teardown();
                server.stopServer();
                int success = server.waitFor();
    
            } catch (ObjectGridException e) {
                // El contenedor no se ha podido inicializar
            } catch (MalformedURLException e2) {
                // url no válido para los archivos xml
            }
    
        }
    
    }