资料内容:
3.1.1 JobInstance
JobInstance涉及到一个运行逻辑job的概念。让我们考虑一下,在一天结束时运行一次批处理任
务,
类似上述图表中的”EndOfDay”任务。有一个统一的”EndOfDay”任务,但是job的每个独立运行都必
须分开跟踪监控。在这个例子中,每天会有一个逻辑的JobInstance。例如,在1月1日运行一次,
在1月2日运行一次。如果1月1日第一次运行失败了,第二天再运行一次,这仍然是1月1日的运行(通
常也和处理的数据对应起来,意味着处理的是1月1日的数据等等)。因此,每个JobInstance能有
多次执行(JobExection的更多详细信息将在下文讨论),而对应于在特定时间运行特定的Job和
JobParameter只有一个JobInstance。
JobInstance的定义完全与加载的数据无关,数据的加载方式只与ItemReader的实现方式相关。例
如在EndOfDay场景中,可能有一个名为”effective data”或是”schedule data”的数据列用来
表示数据所属日期。因此,1月1日运行只会加载属于1日的数据,1月2日运行只会加载2日的数据。因
为这更像是一个业务决定,所以留给ItemReader去处理。另外,使用相同的JobInstance可以决定
是否使用前一次执行使用的状态(例如ExecutionContext,下文讨论)。使用新的JobInstance意
味着“从头开始”,而使用存在的instance通常意味着”从离开的地方开始”。
3.1.2 JobParameters
讨论完JobInstance与Job之间的区别,自然要开始讨论“如何区分一个JobInstance与另一个
JobInstance”。答案是:JobParameters。JobParamters是一组用来启动批处理任务的参数,
他们被用于在运行过程中标记识别或是引用数据:
在上面的例子中一个job有两个实例,一个是1月1日以01-01-2008的参数启动运行,一个是1月2日
以01-02-2008的参数启动运行。因此可以这样定义:JobInstance = Job + JobParameter。
这让开发者有效地控制JobInstance,因为开发者可以有效控制输入给JobInstance的参数。
注意:并非所有的job需要设定参数来对JobInstance进行标识,默认情况下应该设定参数,在该框架中也允许带有参数提交的job
不做对JobInstance进行标识的处理工作。
3.1.3 JobExecution
一个JobExecution的概念是对于运行一次Job。一次执行可能成功也可能失败,但是只有这次执行
完全成功后对应的JobInstance才会被认为是完成了。以之前的EndOfDay任务为例,01-01-2008
第一次运行生成的JobInstance失败后,以相同的参数(01-01-2008)再次运行,一个新的
JobExecution会被创建,但是仍然是同一个JobInstance。
Job定义了任务是什么以及如何启动,JobInstance是纯粹的组织对象用来执行操作组织在一起,主
要目的是开启正确的重启语义,而JobExecution是运行过程中状态的主要存储机制,有着多得多的
属性需要控制与持久化: