在M语言中,面对需要定时执行某项的操作的需求,我们可以使用M语言中自由的Task类实现,其继承自%SYS.Task.Definition类,可以使用TaskManager管理。
我们可以设置以下属性给任务,实现我们的目标,例如在某天某个时间点执行一次,或是每隔一段时间执行/// 任务计划(每天)
/// pDailyFrequency=0 表示每天运行一次
/// pDailyFrequency=1 表示在指定时间范围内运行多次
/// pDailyFrequencyTime=0 表示间隔时间单位为分钟
/// pDailyFrequencyTime=1 表示间隔时间单位为小时
/// pDailyIncrement 表示间隔时间
/// pDailyStartTime 表示运行开始时间,如8:00
/// pDailyEndTime 表示运行结束时间,如18:00
这些都是Task的属性。下面给个简单的例子
Class STUDY.Task Extends %SYS.Task.Definition
{
ClassMethod CreateTask()
{
s task = ##Class(%SYS.Task).%New()
s task.Name = ..%ClassName(1)
s task.TaskClass = ..%ClassName(1) // 当前任务类名
s task.NameSpace = $zu(5) // 指明运行的Namespace
s task.DailyFrequency = 1 //0为每天运行一次,1为每天运行若干次
s task.DailyFrequencyTime = 0 //run every x minutes
s task.DailyIncrement = 1 //run every 1 minutes
s task.DailyStartTime = $zth("15:50")
s task.DailyEndTime = $zth("16:00")
s task.Expires = 0 // 0表示计划的任何时候都会运行
s sc = task.%Save()
s taskID = ##Class(%SYS.Task).FindId(..%ClassName(1))
if 'taskID {
w "Can't find the task specified"
}
s sc = ##Class(%SYS.Task).RunNow(taskID)
}
/// 执行的任务
Method OnTask() As %Status
{
s ^taskStr = ""
s ^taskStr = ^taskStr_"[---Patient Task Creating---]"_"task is running now "_$zdt($h,3)_":"_..%ClassName()
q $$$OK
}
}
上面为在控制台看到任务的详细信息
以上为监控到的任务运行情况,由于expires设置为0
Whether this entry expires.
Expiration is only checked if this flag is set to 1.
Expiration is determined by whichever is first:
1) The current time passed the next submit time.
2) Expiration Offsets (Days, Hours, Minutes).