2023/10/26

DXL Step-by-Step:#7)エージェント実行スケジュールの取得

前回は、エージェント(設計要素)を DXL に変換して内容を確認しました。その情報には、エージェントの実行スケジュールの設定のように LotusScript に標準搭載のクラスで取得できない情報も含まれており、エージェントが計画通り稼働しているか確認できるのではないかという、新たな可能性についてふれました。

今回は、これを題材に、エージェントの実行スケジュールを実際に取得してみます。


実行スケジュールの DXL の確認

まず、実行スケジュールを表す DXL を確認します。関係のあるエレメントと属性だけ抽出すると次のような構造になっていました。実行スケジュールを表すのは、赤字の部分です。

<?xml version="1.0" encoding="utf-16"?>
<!DOCTYPE agent SYSTEM "xmlschemas/domino_12_0_2.dtd">
<agent name='DXL2 #5-x.Sample' alias='SampleAgent' enabled='true'>
    <trigger type='scheduled'>
        <schedule type='byminutes' hours='3' minutes='0' onweekends='false'>
            <starttime>
                <datetime dst='false'>T090000,00</datetime>
            </starttime>
            <endtime>
                <datetime dst='false'>T180000,00</datetime>
            </endtime>
        </schedule>
    </trigger>
</agent>

今回は話を単純化するため、赤字以外の設定である週末の実行や有効時間帯の設定については無視させていただきます。


エージェントエレメントの取得

まずは、DXL からエージェント情報の全体を表す agent エレメントを取得します。ここまでのコードは、設計要素であっても、文書であっても全く同じです。

Function xShowAgentSchedule(vdprs As NotesDOMParser) As Boolean
    'DOM ツリーのルートを取得
    Dim ddn As NotesDOMDocumentNode
    Set ddn = vdprs.Document

    'Agent エレメントの取得
    Dim denAgent As NotesDOMElementNode
    Set denAgent = ddn.DocumentElement

        ・・・

End Function

NotesDOMElementNode クラスの DocumentElement プロパティは、エレメントのタグ名が "document" でなく、"agent" であっても取得できるんですね。


実行スケジュールの取得

次のコードは、実行スケジュールを表す "trigger" と "schedule" エレメントを順に取得し、"schedule" エレメントの属性から実行スケジュールを取得しています。

Function xShowAgentSchedule(vdprs As NotesDOMParser) As Boolean

        ・・・
    'トリガーとスケジュールの取得
    Dim denTrigger As NotesDOMElementNode
    Dim denSchedule As NotesDOMElementNode
    Dim dnl As NotesDOMNodeList
    Dim s As String

    Set dnl = denAgent.GetElementsByTagName("trigger")
    If dnl.NumberOfEntries > 0 Then
        Set denTrigger = dnl.GetItem(1)
        Set dnl = denAgent.GetElementsByTagName("schedule")
        If dnl.NumberOfEntries > 0 Then
            Set denSchedule = dnl.GetItem(1)
            s = "type = " & denSchedule.GetAttribute("type")
            s = s & ", hours = " & denSchedule.GetAttribute("hours")
            s = s & ", minutes = " & denSchedule.GetAttribute("minutes")

            MsgBox s
        End If
    End If
End Function

各エレメントの取得は、GetElementsByTagName で配下のタグを検索して取得しています。このメソッドは、NotesDOMNodeList を返す仕様となっていて、その中の一つ目を取得することで、目的のエレメントを取得しています。

この仕様は、複数のタグにも対応できるよう汎用的に設計されてはいるのですが、今回の用途ではコードが冗長になりますね。


このプログラムを実行すると、次のように実行スケジュールが表示されます。


DXL 開発の難しさ

今回はエージェントの実行スケジュールを取得方法をまとめました。サンプルでは、『1日1回以上』のエージェントを例にしました。別の設定の場合は、次のようになります。

属性 type の値が変わり、必要に応じてその他の属性が増減します。このあたりの構造の変化に柔軟に対応するプログラムの作成は手間がかかりそうです。また、条件に応じてどのような DXL が出力されるのかは、DTD を読み解くか、テストして DXL を確認する必要があります。

LotusScript の定義済みのクラスを使ったプログラムよりもずいぶんドロ臭いコーディングが必要となますね...


◇ 毎日

<schedule type='daily' onweekends='false'>

◇ 毎週

<schedule type='weekly' dayofweek='wednesday' onweekends='true'>

◇ 毎月

<schedule type='monthly' onweekends='true' dateinmonth='1'>


前回 DXL Step-by-Step 次回

0 件のコメント:

コメントを投稿