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.
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); } } } } |
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |