Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » MobiLink - Serveradministration » MobiLink-Server-APIs » Synchronisationsskripten in Java erstellen » Java-Synchronisationslogik schreiben

 

Benutzerdefinierte Startklassen

Sie können Startklassen definieren, die beim Serverstart automatisch geladen werden. Diese Funktion gestattet es Ihnen, Java-Code zu schreiben, der ausgeführt wird, wenn der MobiLink-Server JVM startet, also vor der ersten Synchronisation. Das bedeutet, dass Sie vor der Synchronisationsanforderung eines Benutzers Verbindungen oder Cachedaten erstellen können.

Hierzu verwenden Sie die Option DMLStartClasses der mlsrv11-Option -sl java. Die mlsrv11-Befehlszeile kann beispielsweise Folgendes enthalten. Damit wird bewirkt, dass mycl1 und mycl2 als Startklassen geladen werden.

-sl java(-DMLStartClasses=com.test.mycl1,com.test.mycl2)

Klassen werden in der Reihenfolge geladen, in der sie aufgelistet sind. Wenn dieselbe Klasse mehr als einmal aufgelistet ist, wird mehr als eine Instanz erstellt.

Alle Startklassen müssen "public" sein und einen öffentlichen Konstruktor haben, der keine Argumente oder ein Argument vom Typ ianywhere.ml.script.ServerContext akzeptiert.

Die Namen der geladenen Startklassen werden mit der Meldung "Java-Startklasse geladen: Klassenname" in der MobiLink-Protokolldatei ausgegeben.

Weitere Hinweise zu den Optionen der Java Virtual Machine finden Sie unter Option -sl java.

Welche Startklassen beim Serverstart erstellt werden, finden Sie unter getStartClassInstances-Methode.

Beispiel

Im Folgenden sehen Sie eine Vorlage für eine Startklasse. Sie startet einen Daemon-Thread, der Ereignisse verarbeitet und eine Datenbankverbindung erstellt. (Nicht alle Startklassen müssen einen Thread erstellen, aber wenn ein Thread angestoßen wird, muss es sich um einen Daemon-Thread handeln.)

import ianywhere.ml.script.*;
import java.sql.*;

public class StartTemplate extends
    Thread implements ShutdownListener {
    ServerContext   _sc;
    Connection      _conn;
    boolean         _exit_loop;

    public StartTemplate(ServerContext sc) throws SQLException {

        // Perform setup first so that an exception 
        // causes MobiLink startup to fail.
        _sc = sc;

        // Create a connection for use later.
        _conn = _sc.makeConnection();

        _exit_loop = false;
        setDaemon(true);
        start();
    }

    public void run() {
        _sc.addShutdownListener(this);

        // run() cannot throw exceptions.
        try {
            handlerLoop();
            _conn.close();
            _conn = null;
        }
        catch(Exception e) {
    
            // Print some error output to the MobiLink log.
            e.printStackTrace();
 
            // This thread shuts down and so does not 
            // need to be notified of shutdown.
            _sc.removeShutdownListener(this);
    
            // Ask server to shutdown so that this fatal
            // error is fixed.
            _sc.shutdown();
        }
        // Shortly after return this thread no longer exists.
        return;
    }
 
    // stop our event handler loop
    public void shutdownPerformed(ServerContext sc) {
        try {
            // Wait max 10 seconds for thread to die.
            join(10*1000);
        }
        catch(Exception e) {
            // Print some error output to the MobiLink log.
            e.printStackTrace();
        }
    }

    private void handlerLoop() throws InterruptedException {
        while (!_exit_loop) {
            // Handle events in this loop. Sleep not
            // needed, block on event queue.
            sleep(1 * 1000);
        }
    }
}