初めて作る.NET WindowsサービスVisual Studio Magazine(3/7 ページ)

» 2005年02月01日 18時49分 公開
[Doug Thews,FTPOnline]
リスト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)。

画面2■Windowsサービスにパラメータを渡す。サービスが起動するときにパラメータを渡すには、AppMonitorサービスのプロパティページを使う。AppMonitorの例では、このパラメータを「C:\Windows\Monitor.txt」のように、サービスで用いるログファイルの場所を指定する場合に用いる

© Copyright 2001-2005 Fawcette Technical Publications

注目のテーマ