BATCH处理batchjob的逻辑

 

本文记录了我个人对BATCH处理batchjob逻辑的理解

概述:我们在创建一个继承自runbase的类时,会声明一些变量,然后用宏来保存这些变量,使用Pack和Unpack方法来打包或获取这些变量。

batch实际上是将这个类的classid和用宏保存的变量(以container的形式)保存到一张表上。

当你运行batch processing时,更具一定的条件查找到应该运行的batch记录,使用calssfactory以classid为参数可以新建一个类变量,将保存起来的变量在付给这个类,想到于重现了我们在添加batch时所使用的那个类。然后调用这个新类的run方法来完成任务。

batch的处理过程中主要会涉及到以下对象:

1.       Table/batchjob,该表存储了你所建立的每一个batch任务,你只能通过该batch的创建时间、描述及创建者来区分。

2.       Table/batch,该表存储了一个batchjob所包含的所有具体信息,通过batchjobid关联到batchjob表,即batch.batchjobid == batchjob.recid

3.       Form/batchRun,form用来显示batch处理进度,同时也是使用该form来操作class/batchRun

4.       Class/batchRun,该类使用batch提供的信息来处理一个batch事务。

5.       Class/batchInfo,该类用来创建存储BatchJobBatch

下面讲述处理逻辑:

当你把一个任务添加到Batch时,主要包括以下几步操作:

1.       首先你做某一个操作调用了一个继承自RunBaseBatch的类,并产生一个实例A,该类被用来处理某一类特定任务。你希望将该任务添加到batch队列中,所以通过相关按钮你调用出了一个Batch processing对话框,该对话框会修改runbasebatch中的与batch相关的变量。

2.       在你点击OK提交处理时,如果你在batch processing对话框中勾选了batch processing,则根据你在Batch processing里填写的内容,class/batchInfo会创建一条BatchJob记录

3.       Class/batchInfo创建一条batch记录,batch.batchJobId为步骤2中所创建batchJobrecId batch.parameter存储了一个容器,该容器是A.pack()的结果;batch.classId存储了AclassId

在执行batch时经历以下几步:

1.       首先调用Class/batchRun::main()方法,通过一个dialog你可以输入你要处理的batchJob

2.       class/batchRun中创建Form/batchRun,并将class/batchRun传递进去。

3.       Form/BatchRun遍历所有符合条件的batchJob,寻找到该batchJob所关联的table/batch, 将该条table/batch传递给class/batchRun, 该类首先通过table/batch.classId新建一个对应当类实例A,然后将batch.parameter Unpack A,入A.unpack(batch.parameter)。这样,就相当于我们再现了出来该事务的那个类对象。然后调用A.RUN()处理对应事务。

 

我们以Sales OrderInvoice为例来讲述:

1.       创建一条新的SO(一下部分SO即表示该条记录),在该SO下创建若干条Sales Line

2.       SO执行Posting->Invoice,在打开的Posting Invoice对话框中选择QuantityALL,然后点击对话框右下角的Batch按钮,在弹出的Batch processing 对话框中勾选Batch Processing,然后点击OK,返回到Posting invoice 对话框,点击OK。然后会弹出一个Info提示你该Invoice job已经被添加到batch队列中。

 

 

posting invoice

 

    batch processing

 

infolog

 这个时候去Basic->Batch job list – user 就可以看到刚才创建的batch了。

 

3.       2步骤中,对应当代码是这样走的:

首先,你点击Posting->Invoice会调用SalesFormLetter::main(),由于Menu Invoice带有参数,所以在Main中你会得到一个SalesFormLetter_Invoice的实例;

SalesFormLetter::main()调用SalesFormLetter:mainonServer();

mainOnServer方法中找到语句:

If(salesFormLetter.prompt())

该语句会弹出Posting Invoice对话框。如果你在该对话框中选择了batchPrompt()方法会返回false,而Prompt方法中的super()会调用到父类的方法中,最终会调用到Class/BatchInfo.dobatch()方法,该方法的语句:

this.parmBatchHeader().saveHeader();

会创建一条batchJob记录,随后的语句会创建batch记录。

4.       现在我们开始来处理我们的Batch.

Basic->Periodic->Batch->Processing: 选择刚才所使用的组,点OK

set up batch processing

 

这个时候就开始batch了:

batch processing

 

5.       在第4步中,对应的代码是这样走的:

当你点击Basic->Periodic->Batch->Processing时,调用了class/BatchRun::Main方法,该方法弹出了上图中的对话框,当你点击该对话框的OK后,class/batchRun.run方法会调用form/batchRun, 并在class/batchRun.run中调用form/batchRun.setrunning,该方法使用一个do..while循环,结合class/batchRun.do方法寻找可以运行的batchjob

这一块代码比较复杂,有兴趣的可以自己看看。

但我有一点不明白,当新建一个batchJob时,table/batch中该条记录的状态是waiting,我一直没找到是什么或那个类、方法修改了该状态,让它成为ready,如果哪位朋友知道请回复。谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值