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 .NET erstellen » .NET-Synchronisationslogik schreiben

 

Benutzerdefinierte Startklassen

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

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

-sl dnet(-MLStartClasses=MyNameSpace.MyClass.mycl1,MyNameSpace.MyClass.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 öffentlich sein und einen öffentlichen Konstruktor haben, der entweder keine Argumente oder ein Argument vom Typ "MobiLink.Script.ServerContext" übernimmt.

Die Namen der geladenen Startklassen werden mit der Meldung ".NET-Startklasse geladen: Klassenname".

Weitere Hinweise zu .NET CLR finden Sie unter Option -sl dnet.

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.)

using System;
using System.IO;
using System.Threading;
using iAnywhere.MobiLink.Script; 

namespace TestScripts {
    public class MyStartClass {
        ServerContext    _sc;
        bool             _exit_loop;
        Thread           _thread;
        OdbcConnection   _conn;

        public MyStartClass(ServerContext sc) {

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

            // Create connection for use later.
            _conn = _sc.makeConnection();
            _exit_loop = false;
            _thread = new Thread(new ThreadStart(run)) ;
            _thread.IsBackground = true;
            _thread.Start();
        }

        public void run() {
            ShutdownCallback callback = new ShutdownCallback(shutdownPerformed);
            _sc.ShutdownListener += callback;

            // run() can't throw exceptions.
            try {
                handlerLoop();
                _conn.close();
                _conn = null;
            }
            catch(Exception e) {
                // Print some error output to the MobiLink log.
                Console.Error.Write(e.ToString());
     
                // There is no need to be notified of shutdown.
                _sc.ShutdownListener -= callback;

                // Ask server to shut down so this fatal error can be fixed.
                _sc.Shutdown();
            }

            // Shortly after return, this thread no longer exists.
            return;
        }

        public void shutdownPerformed(ServerContext sc) {
            // Stop the event handler loop.
            try {
                _exit_loop = true;
    
                // Wait a maximum of 10 seconds for thread to die.
                _thread.Join(10*1000);
            } 
            catch(Exception e) {
                // Print some error output to the MobiLink log.
                Console.Error.Write(e.ToString());
            }
        }

        private void handlerLoop() {
            while (!_exit_loop) {
                // Handle events in this loop.
                Thread.Sleep(1*1000);
            }
        }
    }
}