【IRIS/Cache】タスク(%SYS.Task)についての備忘録

本記事は、タスク(%SYS.Task)についての備忘録になります。

※この記事は下記の方向けになります。
  • タスクの登録と読み取り等々の操作を、管理ポータル以外で行いたい方

はじめに

本記事は、Winsowsのタスクスケジューラとは異なる、IRIS/Cache固有のタスクの解説になります。

管理ポータルで確認するには、[システムオペレーション] > [タスクマネージャ] > [タスクスケジュール]と進むと、下記画面が表示されます。

登録・変更・削除等の操作は、基本的にこの画面で行う事になる思いますが、まれに「コマンドで追加/削除したい」とか、「一覧を表示したい」などの要望があったりなかったりします。

そんな時にお世話になるのが、クラス「%SYS.Task.cls」です。

管理ポータルで作成したタスクスケジューラも、このクラスに登録しています。
そのため、このクラスをコマンドやSQL等で操作する事により、追加/削除が可能になります。

SQLでタスク一覧を参照する

一先ず、全件全項目を確認するため、下記クエリを実行します。

select * from %SYS.Task

分かりやすいように管理ポータルで実行してみます。
ネームスペースの指定は無く、どのネームスペースでも実行可能です。

必用の是非はともかく、管理ポータルの表示に近づけるのであれば、下記項目をチョイスすれば良いと思います。

select
 Name,
 Type,
 NameSpace,
 Description,
 ID,
 Suspended,
 DisplayFinished,
 DisplayNextScheduled
from %SYS.Task

参照だけなら、こっちの方が見やすいな・・・(笑

タスクの登録/削除

%SYS.Taskを使い、タスクの登録と削除を行います。

%SYS.Taskは、親クラスに%SYS.TaskSuperが設定されており、プロパティ・関数等々は、ほぼこのクラスで設定されています。

タスクの実行やサスペンドの設定など、必要に応じてコマンドを使用して操作することが可能です。
詳細な操作方法や具体的な手順については、必要に応じて公式ドキュメントをご参照ください

タスクの登録

下記は、1日1回 午前1:00に実行するタスクの登録となります。

ClassMethod MakeTask()
{
	s task = ##class(%SYS.Task).%New()
	, task.Name = "コマンド追加タスク"
	, task.Description = "説明:コマンドで追加しました"
	, task.NameSpace = $namespace
	, task.TaskClass = "%SYS.Task.RunLegacyTask" // 今回はレガシータスクを使用します
	, task.Settings = $lb("ExecuteCode","d ##class(developer.Sample).killData()")
	, task.TimePeriod = 0 // DAILY
	, task.TimePeriodEvery = 1
	, task.TimePeriodDay=""
	, task.DailyFrequency = 0 // 日に1回実行
	, task.DailyFrequencyTime = ""
	, task.DailyStartTime = $zth("01:00:00") // 1:00に実行
	, task.RunAsUser = "UnknownUser" // 実行ユーザ
	
	w task.%Save()
}

コマンド実行後、タスクスケジューラを確認すると、下記タスクが登録されています。

タスクの削除

データクラスなので、%DeleteId()コマンドで削除が可能です。
IDが事前に取得できていればそのまま実行できますが、タスクの名称(Name)からIDを検索する事も可能です。

ClassMethod DeleteTask()
{
	// タスクの名称からIDを取得する
	s taskId = ##class(%SYS.Task).FindId("コマンド追加タスク")
	i (taskId'=""){
		w ##class(%SYS.Task).%DeleteId(taskId)
	}
}

タスクのエクスポート/インポート

タスクはエクスポートして、別環境に同じタスクを設定する事が可能です。

エクスポート

ファイル名は任意ですが、拡張子は「.xml」になります。
%SYS.TaskSuperの親クラスに「%XML.Adaptor」が設定されているので、何となく察しますね。

ExportTasksの引数は、レコードID(%List)と出力先(ファイル名込み)になります。

ClassMethod ExportTask(exportFile As %String)
{
	s idList = $lb(1001,1002) // レコードID=1001, 1002を出力する
	w ##class(%SYS.TaskSuper).ExportTasks(idList, exportFile)
}

では、下記コマンドで実行してみましょう

d ##class(developer.task.Sample).ExportTask("D:\Temp\xml\exportedTasks.xml")
<?xml version="1.0" encoding="UTF-8"?>
<Tasks><Task>
  <Name>Sample</Name>
  <RunAsUser>UnknownUser</RunAsUser>
  <EmailOutput>false</EmailOutput>
  <Expires>true</Expires>
  <OpenOutputFile>false</OpenOutputFile>
  <OutputFileIsBinary>true</OutputFileIsBinary>
  <SuspendOnError>false</SuspendOnError>
  <SuspendTerminated>false</SuspendTerminated>
  <Suspended>0</Suspended>
  <Priority>0</Priority>
  <TaskClass>%SYS.Task.RunLegacyTask</TaskClass>
  <Settings>DQFFeGVjdXRlQ29kZSgBZCAjI2NsYXNzKGRldmVsb3Blci5TYW1wbGUpLmtpbGxEYXRhKCk=</Settings>
  <IsBatch>false</IsBatch>
  <NameSpace>SAMPLE</NameSpace>
  <TimePeriod>0</TimePeriod>
  <TimePeriodEvery>1</TimePeriodEvery>
  <DailyFrequency>0</DailyFrequency>
  <DailyFrequencyTime>1</DailyFrequencyTime>
  <DailyStartTime>00:00:00</DailyStartTime>
  <DailyEndTime>00:00:00</DailyEndTime>
  <JobGUID>4ABA6270-6E54-4A80-A65A-1AFE3D74DC8C</JobGUID>
  <StartDate>2024-12-19</StartDate>
  <LastSchedule>0</LastSchedule>
  <LastStarted>0</LastStarted>
  <LastFinished>0</LastFinished>
  <MirrorStatus>1</MirrorStatus>
  <Type>2</Type>
  <RescheduleOnStart>false</RescheduleOnStart>
  <DeleteAfterRun>false</DeleteAfterRun>
  <Description>サンプル用に登録</Description>
</Task>

<Task>
  <Name>コマンド追加タスク</Name>
  <RunAsUser>UnknownUser</RunAsUser>
  <EmailOutput>false</EmailOutput>
  <Expires>true</Expires>
  <OpenOutputFile>false</OpenOutputFile>
  <OutputFileIsBinary>true</OutputFileIsBinary>
  <SuspendOnError>false</SuspendOnError>
  <SuspendTerminated>false</SuspendTerminated>
  <Suspended>0</Suspended>
  <Priority>0</Priority>
  <TaskClass>%SYS.Task.RunLegacyTask</TaskClass>
  <Settings>DQFFeGVjdXRlQ29kZSgBZCAjI2NsYXNzKGRldmVsb3Blci5TYW1wbGUpLmtpbGxEYXRhKCk=</Settings>
  <IsBatch>false</IsBatch>
  <NameSpace>SAMPLE</NameSpace>
  <TimePeriod>0</TimePeriod>
  <TimePeriodEvery>1</TimePeriodEvery>
  <DailyFrequency>0</DailyFrequency>
  <DailyStartTime>01:00:00</DailyStartTime>
  <DailyEndTime>00:00:00</DailyEndTime>
  <JobGUID>501274AE-7B00-4648-8B0B-F63600729243</JobGUID>
  <StartDate>2024-12-19</StartDate>
  <LastSchedule>0</LastSchedule>
  <LastStarted>0</LastStarted>
  <LastFinished>0</LastFinished>
  <MirrorStatus>1</MirrorStatus>
  <Type>2</Type>
  <RescheduleOnStart>false</RescheduleOnStart>
  <DeleteAfterRun>false</DeleteAfterRun>
  <Description>説明:コマンドで追加しました</Description>
</Task>
</Tasks>

インポート

インポートする際は、下記コマンドで行います。

ClassMethod InportTask(importFile As %String)
{
	w ##class(%SYS.TaskSuper).ImportTasks(importFile)
}

ただ、一筋縄ではいかないパターンが多く、だいたいエラーになっているイメージです。

インポート時にエラーになった際は、下記エレメントやエラーステータス・メッセージ等のエレメントを削除するとうまくいくケースがあります。
LastSchedule, LastStarted, LastFinished

タスクのデータ

タスクのデータ(グローバル)はどこにあるでしょうか。

%SYS.TaskSuperのクラスを確認すると「^SYS(“Task”,”TaskD”)」と記述されています。
では、管理ポータルで ^SYS(“Task”,”TaskD”) グローバルを確認してみます。

発見。
最悪、ここをちょこちょこ弄るだけでも出来そうですね(笑)。

おわりに

いかがでしょうか。

さらっとですが、タスクのコマンド操作をご紹介しました。

今回の記事を参考に、ぜひ%SYS.Taskを活用してシステム管理を効率化してみてください。
公式ドキュメントや環境で実際に試してみることで、さらに理解が深まるはずです。

今回の記事で取り上げた内容について、ご意見やご質問がありましたら、ぜひコメント欄でお知らせください。
皆さんのご意見を参考に、さらなる情報を発信していきたいと考えています。

最後までお読みいただき、ありがとうございました。