Utilisation de l'API de serveur embarqué pour démarrer et arrêter les serveurs

Avec WebSphere eXtreme Scale, vous pouvez utiliser une interface de programmation d'application pour gérer le cycle de vie des conteneurs et serveurs imbriqués. Vous pouvez configurer le serveur à l'aide d'un programme avec les options que vous pouvez également configurer avec la ligne de commande ou les propriétés de serveur incluses dans un fichier. Vous pouvez configurer le serveur imbriqué pour en faire un serveur de conteneur et/ou un service de catalogue. 

Avant de commencer

Vous devez disposer d'une méthode permettant d'exécuter du code depuis une machine virtuelle Java existante. les classes eXtreme Scale doivent être disponibles dans l'arborescence du chargeur de classe.

Pourquoi et quand exécuter cette tâche

Vous pouvez effectuer de nombreuses tâches d'administration à l'aide de l'API d'administration. L'API est couramment utilisée comme serveur interne pour stocker l'état d'une application Web. Le serveur Web peut démarrer un serveur WebSphere eXtreme Scale imbriqué et signaler le serveur de conteneur au service de catalogue. Le serveur est ensuite ajouté comme membre d'une grille répartie plus importante. Cette utilisation peut offrir des possibilité d'évolution et une haute disponibilité à un fichier de données qui reste sinon volatile.

Vous pouvez contrôler à l'aide d'un programme le cycle de vie complet d'un serveur eXtreme Scale imbriqué. Les exemples sont aussi génériques que possible et n'illustrent que des exemples de code spécifiques aux étapes présentées.

Procédure

  1. Procurez-vous l'objet ServerProperties de la classe ServerFactory et configurez les options nécessaires. Pour plus d'informations sur l'interface ServerProperties, voir Interface ServerProperties.
    Chaque serveur eXtreme Scale possède un ensemble de propriétés configurables. Lorsqu'un serveur est démarré à partir de la ligne de commande, ces propriétés reçoivent les valeurs par défaut, mais vous pouvez remplacer plusieurs propriétés en fournissant un fichier ou une source externe. Dans la portée imbriquée, vous pouvez directement définir les propriétés avec un objet ServerProperties. Vous devez définir ces propriétés avant d'obtenir une instance de serveur de la classe ServerFactory. L'exemple de fragment de code ci-après obtient un objet ServerProperties, définit la zone CatalogServiceBootStrap et initialise plusieurs paramètres de serveur facultatifs. Pour une liste des paramètres configurables, reportez-vous à la documentation de l'API.
    ServerProperties props = ServerFactory.getServerProperties();
    props.setCatalogServiceBootstrap("host:port"); // requis pour se connecter à un service de catalogue spécifique
    props.setServerName("ServerOne"); // nommez le serveur
    props.setTraceSpecification("com.ibm.ws.objectgrid=all=enabled"); // Définit la spécification de trace
  2. Si vous souhaitez que le serveur soit un service de catalogue, procurez-vous l'objet CatalogServerProperties.

    Pour plus d'informations sur l'interface CatalogServerProperties, voir Interface ServerProperties .

    Chaque serveur imbriqué peut être un service de catalogue, un serveur conteneur ou un serveur de conteneur et un service de catalogue. L'exemple ci-après obtient l'objet CatalogServerProperties, active l'option de service de catalogue et configure divers paramètres de service de catalogue.
    CatalogServerProperties catalogProps = ServerFactory.getCatalogProperties();
    catalogProps.setCatalogServer(true); // false par défaut ; doit être défini comme service de catalogue
    catalogProps.setQuorum(true); // active/désactive le quorum
  3. Procurez-vous une instance Server à partir de la classe ServerFactory. L'instance Server est un singleton de portée processus chargé de gérer l'appartenance dans la grille. Une fois que cette instance a été instanciée, ce processus est connecté et devient hautement disponible pour les autres serveurs de la grille.

    Pour plus d'informations sur l'interface Server, voir Interface Server. Pour plus d'informations sur la classe ServerFactory, voir Classe ServerFactory.

    L'exemple suivant montre comment créer l'instance Server :
     Server server = ServerFactory.getInstance();
    Si nous considérons l'exemple précédent, la classe ServerFactory fournit une méthode statique qui renvoie une instance Server.  La classe ServerFactory est prévue pour être la seule interface permettant d'obtenir une instance Server. Par conséquent la classe garantit que l'instance est un singleton ou une instance pour chaque machine virtuelle Java ou chargeur de classe isolé. La méthode getInstance initialise l'instance Server. Vous devez configurer toutes les propriétés du serveur avant d'initialiser l'instance. La classe Server est chargée de créer des instances Container.  Vous pouvez utiliser à la fois la classe ServerFactory et la classe Server pour gérer le cycle de vie de l'instance Server imbriquée.

    Pour plus d'informations sur l'interface Container, voir Interface Container.

  4. Démarrez une instance Container à l'aide de l'instance Server.
    Pour que des fragments puissent être positionnées sur un serveur imbriqué, vous devez créer un conteneur sur le serveur. L'interface Server contient une méthode createContainer et accepte un argument DeploymentPolicy. L'exemple ci-après utilise l'instance de serveur que vous avez obtenue pour créer un conteneur à l'aide du fichier de règles de déploiement. Notez que les conteneurs requièrent un chargeur de classe pour lequel les fichiers binaires de l'application sont disponibles, à des fins de sérialisation. Vous pouvez rendre ces fichiers binaires disponibles en appelant la méthode createContainer avec comme chargeur de classe du contexte de l'unité d'exécution, celui que vous souhaitez utiliser.
    DeploymentPolicy policy = DeploymentPolicyFactory.createDeploymentPolicy(new 
    	  URL("file://urltodeployment.xml"), 
    	new URL("file://urltoobjectgrid.xml"));
    Container container = server.createContainer(policy);
  5. Supprimez et nettoyez un conteneur.

    Vous pouvez supprimer et nettoyer un serveur de conteneur en exécutant la méthode teardown sur l'instance Container obtenue. L'exécution de la méthode teardown sur un conteneur nettoie ce dernier de manière appropriée et supprime le conteneur du serveur imbriqué.  

    La procédure de nettoyage du conteneur inclut le déplacement et le démontage de tous les fragments positionnés dans ce conteneur. Chaque serveur peut contenir plusieurs conteneurs et fragments. Le nettoyage d'un conteneur n'affecte pas le cycle de vie de l'instance Server parent. L'exemple ci-après montre comment exécuter la méthode teardown sur un serveur. La méthode teardown est rendue accessible via l'interface ContainerMBean. En utilisant l'interface ContainerMBean, si vous n'avez plus accès à ce conteneur à l'aide d'un programme, vous pouvez toujours le supprimer et le nettoyer avec son bean géré. Une méthode terminate existe également dans l'interface Container ; ne l'utilisez pas, sauf si cela est indispensable. Cette méthode est plus puissante et ne coordonne pas un déplacement et un nettoyage des fragments appropriés.
    container.teardown();
  6. Arrêtez le serveur imbriqué.
    Lorsque vous arrêtez un serveur imbriqué, vous arrêtez également les conteneurs et les fragments en cours d'exécution sur ce serveur. Lorsque vous arrêtez un serveur imbriqué, vous devez nettoyer toutes les connexions ouvertes et déplacer ou démonter tous les fragments. L'exemple ci-après illustre comment arrêter un serveur et utiliser la méthode waitFor sur l'instance Server pour s'assurer que cette dernière s'arrête complètement. Comme pour l'exemple de conteneur, la méthode stopServer est rendue accessible via l'interface ServerMBean. A l'aide de cette interface, vous pouvez arrêter un serveur avec le bean géré (MBean) correspondant.
    ServerFactory.stopServer();  // Utilise la fabrique pour arrêter le singleton du serveur
     // ou
    server.stopServer(); // Utilise directement l'instance Server
    server.waitFor(); // Est renvoyé une fois que le serveur a correctement terminé ses procédures d'arrêt
    Exemple de code complet :
     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
    
                /*
                 * Dans la plupart des cas, le serveur ne sert que de serveur de conteneur
                 * et se connecte à un service de catalogue externe. Cette utilisation
                 * favorise davantage la haute disponibilité. L'extrait de code commenté
                 * ci-après permet à ce serveur de devenir un service de catalogue.
                 *
                 *
                 * CatalogServerProperties catalogProps =
                 * ServerFactory.getCatalogProperties();
                 * catalogProps.setCatalogServer(true); // activez le service de catalogue
                 * catalogProps.setQuorum(true); // activez le quorum
                 */
    
                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);
                
                /*
                 * Le fragment est maintenant positionné sur ce conteneur si les exigences
                 * de déploiement sont satisfaites.
                 * Cela englobe la création du serveur et du conteneur imbriqués.
                 *
                 * Les lignes ci-après illustrent simplement l'appel des méthodes de nettoyage
                 */
                
                container.teardown();
                server.stopServer();
                int success = server.waitFor();
    
            } catch (ObjectGridException e) {
                // Container failed to initialize
            } catch (MalformedURLException e2) {
                // invalid url to xml file(s)
            }
    
        }
    
    }