Database.Stateful是Salesforce内置的一个接口类,batchable job
默认是无状态的,也就是说即使在batchable job
类中定义了实例变量,这些变量在start/excute/finish
函数执行时, 会被重新初始化,并不能保持运行过程中的状态。请看示例代码:
1 | global class TestBatchable implements Database.Batchable<SObject> { |
以上batchable job
分两个batch运行后,
1 | TestBatchable testBatchable = new TestBatchable(); |
执行结果为:
start exec, idx:1
execing, idx:2
execing, idx:2
finish exec, idx:1
如果需要保持运行过程中的状态,需要batchable job
实现Database.stateful
接口,请看对比例子:
1 | global class TestBatchable implements Database.Batchable<SObject>, Database.Stateful { |
同样将这个batchable job
分两个batch运行后,执行结果为:
start exec, idx:1
execing, idx:2
execing, idx:3
finish exec, idx:3
可以看到,batchable job
的excute接口串行运行,同时idx变量的状态得到保持。
另外值得一提的是,Database.stateful
接口中并没有定义任何函数需要实例实现,这个比较少见,但是值得学习。此处stateful仅仅表述batchable实例的一个状态,通常我们设计类的时候,会将该状态设计成类的一个成员变量,在构造函数或者setter中配置这个状态。这样的坏处是,如果这样的状态位太多,会使得类很累赘。如果把这样的状态位设计成接口,由用户选择是否需要实现这些接口,设计可以变得更加优雅、简介。