要运行批处理任务必须有一台batch server,在system administration->Setup->Server configuration下选择一台AOS服务器,选中Is batch server,这台AOS服务器就成为一台batch server的服务器。
和Axapta 3.0一样,要运行批处理任务需要从RunBaseBatch扩展一个类:
class Batch4DemoClass extends RunBaseBatch { } public void run() { // The purpose of your job. info(strFmt("Hello from Batch4DemoClass .run at %1" ,DateTimeUtil ::toStr( DateTimeUtil ::utcNow()) )); } public container pack() { return conNull(); } public boolean unpack(container packedClass) { return true; }
这里定义了一个最简单的批处理任务,pack和unpack是必须重载的。下面创建一个job来schedule这个批处理:
static void Job_ScheduleBatch2(Args _args) { BatchHeader batHeader; BatchInfo batInfo; RunBaseBatch rbbTask; str sParmCaption = "My Demonstration (b351)"; ; rbbTask = new Batch4DemoClass(); batInfo = rbbTask.batchInfo(); batInfo.parmCaption(sParmCaption); batInfo.parmGroupId(""); // The "Empty batch group". batHeader = BatchHeader::construct(); batHeader.addTask(rbbTask); batHeader.save(); info(strFmt("'%1' batch has been scheduled.", sParmCaption)); }
运行这个job,在System administration->Inquries->Batch jobs下就能看到名为“My Demonstration (b351)”的批处理任务,任务的预定运行时间就是当前的时间,很快这个任务就会得到执行,执行完后可以从Batch job history看到run()中显示在infolog里的信息。记得需要在AOT中执行下Incremental CIL generation form X++,因为批处理任务需要在.net下运行。如果要设定任务的排程时间信息,可以使用BatchInfo.parmRecurrenceData()方法。如果我们只希望这个batch job只在相应用户从客户端登陆时在客户端运行,还需要重载Batch4DemoClass的方法runsImpersonated返回false:
public boolean runsImpersonated() { // false means that the batch must run on a client. return false; }