Integrierte Server-API zum Starten und Stoppen von Servern verwenden

Mit WebSphere eXtreme Scale können Sie eine programmgesteuerte API verwenden, um den Lebenszyklus integrierter Server und Container zu verwalten. Sie können den Server über das Programm mit jeder der Optionen konfigurieren, die Sie auch über die Befehlszeilenoptionen oder dateibasierten Servereigenschaften konfigurieren können. Sie können den integrierten Server als Container-Server und/oder Katalogservice konfigurieren.

Vorbereitende Schritte

Sie müssen eine Methode für die Ausführung von Code über eine bereits vorhandene Java Virtual Machine haben. Die eXtreme-Scale-Klassen müssen über die Baumstruktur der Klassenladeprogramme verfügbar sein.

Informationen zu diesem Vorgang

Viele Verwaltungstasks können über die Verwaltungs-API ausgeführt werden. Die API wird häufig als interner Server für die Speicherung des Webanwendungsstatus eingesetzt. Der Webserver kann als integrierter WebSphere eXtreme Scale-Server gestartet werden, den Container-Server dem Katalogservice melden, und anschließend wird der Server als Member eines größeren verteilten Grids hinzugefügt. Diese Verwendung kann aus einem ansonsten flüchtigen Datenspeicher einen skalierbaren und hoch verfügbaren Datenspeicher machen.

Sie können den vollständigen Lebenszyklus eines integrierten eXtreme-Scale-Servers über das Programm steuern. Die Beispiele sind so generisch wie möglich und enthalten nur direkte Codemuster für die beschriebenen Schritte.

Vorgehensweise

  1. Rufen Sie das Objekt "ServerProperties" aus der Klasse "ServerFactory" ab, und konfigurieren Sie alle erforderlichen Optionen. Weitere Informationen zur Schnittstelle "ServerProperties" finden Sie im Abschnitt Schnittstelle "ServerProperties".
    Jeder eXtreme-Scale-Server besitzt eine Reihe konfigurierbarer Eigenschaften. Wenn ein Server über die Befehlszeile gestartet wird, werden diese Eigenschaften auf Standardwerte gesetzt, aber Sie können mehrere Eigenschaften überschreiben, indem Sie eine externe Quelle oder Datei angeben. Im integrierten Bereich können Sie die Eigenschaften direkt mit einem ServerProperties-Objekt setzen. Sie müssen diese Eigenschaften setzen, bevor Sie eine Serverinstanz aus der Klasse "ServerFactory" abrufen. Das folgende Beispiel-Snippet ruft ein ServerProperties-Objekt ab, setzt das Feld "CatalogServiceBootStrap" und initialisiert mehrere optionale Servereinstellungen. Eine Liste der konfigurierbaren Einstellungen finden Sie in der API-Dokumentation.
    ServerProperties props = ServerFactory.getServerProperties();
    props.setCatalogServiceBootstrap("host:port");
    // Für Verbindungsherstellung zu einem bestimmtem Katalogserver erforderlich
    props.setServerName("ServerOne"); // Server benennen
    props.setTraceSpecification("com.ibm.ws.objectgrid=all=enabled"); // Tracespezifikation festlegen
  2. Wenn der Server ein Katalogserver sein soll, rufen Sie das Objekt "CatalogServerProperties" ab.

    Weitere Informationen zur Schnittstelle "CatalogServerProperties" finden Sie im Abschnitt Schnittstelle "CatalogServerProperties".

    Jeder integrierte Server kann ein Katalogserver und/oder ein Container-Server sein. Der folgende Beispielcode ruft das Objekt "CatalogServerProperties" ab, aktiviert die Katalogserviceoption und konfiguriert verschiedene Einstellungen des Katalogservice.
    CatalogServerProperties catalogProps = ServerFactory.getCatalogProperties();
    catalogProps.setCatalogServer(true);
    // standardmäßig false; erforderlich für die Einstellung als Katalogservice
    catalogProps.setQuorum(true); // Quorum aktivieren/inaktivieren
  3. Rufen Sie eine Server-Instanz aus der Klasse "ServerFactory" ab. Die Server-Instanz ist ein prozessbezogenes Singleton, das für die Verwaltung der Zugehörigkeiten im Grid zuständig ist. Nach der Instanziierung dieser Instanz ist dieser Prozess verbunden und zusammen mit den anderen Servern im Grid hoch verfügbar.

    Weitere Informationen zur Schnittstelle "Server" finden Sie im Abschnitt Schnittstelle "Server". Weitere Informationen zur Klasse "ServerFactory" finden Sie im Abschnitt Klasse "ServerFactory".

    Das folgende Beispiel veranschaulicht, wie die Server-Instanz erstellt wird:
     Server server = ServerFactory.getInstance();
    Wenn Sie sich das vorherige Beispiel ansehen, stellen Sie fest, dass die Klasse "ServerFactory" eine statische Methode bereitstellt, die eine Server-Instanz zurückgibt. Die Klasse "ServerFactory" ist die einzige geplante Schnittstelle für das Abrufen einer Server-Instanz. Deshalb stellt die Klasse sicher, dass die Instanz ein Singleton bzw. die einzige Instanz für jede JVM bzw. jedes isolierte Klassenladeprogramm ist. Die Methode "getInstance" initialisiert die Server-Instanz. Sie müssen alle Servereigenschaften konfigurieren, bevor Sie die Instanz initialisieren. Die Klasse "Server" ist für die Erstellung neuer Container-Instanzen zuständig. Sie können die Klassen "ServerFactory" und "Server" verwenden, um den Lebenszyklus der integrierten Serverinstanz zu verwalten.

    Weitere Informationen zur Schnittstelle "Container" finden Sie im Abschnitt Schnittstelle "Container".

  4. Starten Sie eine Container-Instanz über die Serverinstanz.
    Bevor Shards an einen integrierten Server verteilt werden können, müssen Sie einen Container im Server erstellen. Die Schnittstelle "Server" besitzt eine Methode "createContainer", die das Argument "DeploymentPolicy" akzeptiert. Im folgenden Beispiel wird die Serverinstanz, die Sie zum Erstellen eines Containers abgerufen haben, mit einer erstellten DeploymentPolicy-Datei verwendet. Beachten Sie, dass Container für die Serialisierung ein Klassenladeprogramm erfordern, dem die Binärdateien der Anwendung zur Verfügung stehen. Sie können diese Binärdateien bereitstellen, indem Sie die Methode "createContainer" aufrufen und in diesem Aufruf das Klassenladeprogramm für den Thread-Kontext auf das Klassenladeprogramm setzen, das Sie verwenden möchten.
    DeploymentPolicy policy = DeploymentPolicyFactory.createDeploymentPolicy(new
    	  URL("file://urltodeployment.xml"),
    	new URL("file://urltoobjectgrid.xml"));
    Container container = server.createContainer(policy);
  5. Entfernen und bereinigen Sie einen Container.

    Sie können einen Container-Server entfernen und bereinigen, indem Sie die Methode "teardown" für die abgerufene Containerinstanz ausführen. Bei der Ausführung der Methode "teardown" für einen Container wird der Container bereinigt und aus dem integrierten Server entfernt.

    Die Bereinigung des Containers beinhaltet die Verlagerung und Umrüstung aller Shards dieses Containers. Jeder Server kann mehrere Container und Shards enthalten. Die Bereinigung eines Containers hat keine Auswirkung auf den Lebenszyklus der übergeordneten Server-Instanz. Das folgende Beispiel veranschaulicht, wie die Methode "teardown" für einen Server ausgeführt wird. Die Methode "teardown" wird über die Schnittstelle "ContainerMBean" bereitgestellt. Wenn Sie keinen Zugriff mehr über das Programm auf diesen Container haben und die Schnittstelle "ContainerMBean" verwenden, können Sie den Container mit der zugehörigen MBean trotzdem bereinigen. Die Schnittstelle "Container" enthält auch eine Methode "terminate". Verwenden Sie diese Methode nur, wenn es unbedingt erforderlich ist. Diese Methode ist konsequenter und koordiniert die entsprechende Shard-Verlagerung und -Bereinigung nicht.
    container.teardown();
  6. Stoppen Sie den integrierten Server.
    Wenn Sie einen integrierten Server stoppen, stoppen Sie auch alle Container und Shards, die im Server ausgeführt werden. Wenn Sie einen integrierten Server stoppen, müssen Sie alle offenen Verbindungen bereinigen und alle Shards verlagern oder umrüsten. Das folgende Beispiel veranschaulicht, wie ein Server gestoppt wird und die Methode "waitFor" in der Schnittstelle "Server" verwendet wird, um sicherzustellen, dass die Serverinstanz vollständig beendet wird. Ähnlich wie im Containerbeispiel wird die Methode "stopServer" über die Schnittstelle "ServerMBean" bereitgestellt. Mit dieser Schnittstelle können Sie einen Server über die entsprechende Managed Bean (MBean) stoppen.
    ServerFactory.stopServer();  // Factory zum Beenden des Server-Singletons
     // oder
    server.stopServer(); // Serverinstanz direkt verwenden
    server.waitFor();
    // Kehrt zurück, wenn die Beendigungsprozedur für den Server ordnungsgemäß abgeschlossen wurde
    Vollständiges Codebeispiel:
     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"); // Server benennen
                props.setTraceSpecification("com.ibm.ws.objectgrid=all=enabled"); // TraceSpec
    
                /*
                 * In den meisten Fällen dient der Server nur als Container-Server und
                 * stellt eine Verbindung zu einem externen Katalogserver her. Auf diese
                 * Weise wird eine höhere Verfügbarkeit erreicht. Der folgende, auf Kommentar
                 * gesetze Codeauszug aktiviert diesen Server als Katalogserver.
                 *
                 *
                 * CatalogServerProperties catalogProps =
                 * ServerFactory.getCatalogProperties();
                 * catalogProps.setCatalogServer(true); // Katalogservice aktivieren
                 * catalogProps.setQuorum(true); // Quorum aktivieren
                 */
    
                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);
                
                /*
                 * Das Shard wird jetzt an diesen Container verteilt, wenn die
                 * Implementierungsanforderungen erfüllt sind.
                 * Dies umfasst die Erstellung des integrierten Servers und des Containers.
                 *
                 * Die folgenden Zeilen demonstrieren lediglich den Aufruf der Bereinigungsmethoden.
                 */
                
                container.teardown();
                server.stopServer();
                int success = server.waitFor();
    
            } catch (ObjectGridException e) {
                // Container konnte nicht initialisiert werden.
            } catch (MalformedURLException e2) {
                // Ungültiger URL für XML-Datei(en)
            }
    
        }
    
    }