リスト1■基底クラスのルーチンをオーバーライドする(VB.NET)。サービスの基底クラスにおけるプロシージャ定義をオーバーライドすることで、自身のサービスのイベントハンドラを定義できる |
Protected Overrides Sub OnStart(ByVal args() As _ String) ' サービスが最初に起動するときに実行するコードをここに書く ' 例えばバックグラウンドで動作するタイマーを備えたスレッドを ' 生成するなど ' 引数としてログファイルのパスが渡されたかどうかを確認する If (args.Length = 0) Then strLogDest = "\Monitor.txt" Else strLogDest = args(0).ToString End If WriteAuditEntry(Now.ToString + _ ": Service Started") End Sub Protected Overrides Sub OnStop() ' サービスが終了するときに必要な破棄コードをここに書く WriteAuditEntry(Now.ToString + _ ": Service Stopped") End Sub Protected Overrides Sub OnPause() ' サービスが一時停止するときに必要なコードをここに書く WriteAuditEntry(Now.ToString + ": Service Paused") End Sub Protected Overrides Sub OnContinue() ' サービスが再開するときに必要なコードをここに書く WriteAuditEntry(Now.ToString + _ ": Service Resumed") End Sub Protected Overrides Sub OnCustomCommand( _ ByVal iCommand As Integer) ' 外部アプリケーションからのサービスのカスタムコマンドを ' 扱うのに必要なコードをここに書く ' コマンドを調べてログとして記録する Select Case iCommand Case MonitorWrapper.MonitorWrapper. _ MonitorCode.MON_GATE_A_OPEN WriteAuditEntry(Now.ToString + _ ": 門Aが開いた") Case MonitorWrapper.MonitorWrapper. _ MonitorCode.MON_GATE_B_OPEN WriteAuditEntry(Now.ToString + _ ": 門Bが開いた") Case MonitorWrapper.MonitorWrapper. _ MonitorCode.MON_FIREALARM_A WriteAuditEntry(Now.ToString + _ ": ゾーンAの火災報知器が作動した") Case MonitorWrapper.MonitorWrapper. _ MonitorCode.MON_SPRINKLER_A WriteAuditEntry(Now.ToString + _ ": ゾーンAのスプリンクラーが作動した") Case Else WriteAuditEntry(Now.ToString + _ ": UNDEFINED COMMAND RECEIVED (" + _ iCommand.ToString + ")") End Select End Sub Private Sub WriteAuditEntry(ByVal strMsg As String) Dim sw As StreamWriter If File.Exists(strLogDest) Then sw = New StreamWriter(strLogDest, True) Else sw = File.CreateText(strLogDest) End If sw.WriteLine(strMsg) sw.Close() End Sub |
リスト1の例では、可能な限りのイベントプロシージャ定義をオーバーライドすることで、Windowsサービスにおけるすべてのイベントに対して受け応えするようにしている。Start(開始)、Stop(停止)、Pause(一時停止)、Continue(再開)といったイベントに加え、次に示すカスタムコマンドプロシージャがあるという点にも注目してほしい。
Protected Overrides Sub OnCustomCommand( _ ByVal iCommand As Integer) |
このプロシージャは、サービスが実行されている間、外部アプリケーションがサービスに対して整数値のコマンドを送れるようにするためのものだ。
また、このプロシージャでは戻り値を返すことができないわけは、プロセスとサービスとの通信で原始的な一方向のIPC接続利用が想定されているからだ。AppMonitorサービスの例では、アプリケーションからAppMonitorサービスに向けてモニタリングイベントを発行する手段を提供するためにOnCustomCommandを利用する。
ここでは話を簡単にするため、OnCustomCommandでは、受け取ったコマンドを試験的なログファイルに記録するだけにしてある。この例は、実環境に合わせて簡単に拡張できるだろう。例えば、データベースにモニタリング情報を保存するとか、メッセージキューにメッセージを送り込むといった具合だ。
ところで起動時には、パラメータをWindowsサービスに渡すこともできる。OnStartルーチンでは、引数として文字列の配列をとるという点に注目しよう。
Protected Overrides Sub OnStart( _ ByVal args() As String) |
AppMonitorの例では、ログファイルの名前や位置を指定するのにパラメータを利用している。引数が渡されずにサービスが起動したときには、単純にルートディレクトリのファイルをログの記録に使っている。
サービスに対して引数を設定するには、MMCスナップインの[サービス]からサービスのプロパティを開き、[Start parameters](訳注:日本語版では[開始パラメータ])のテキストボックスにパラメータを入力する(画面2)。
© Copyright 2001-2005 Fawcette Technical Publications