此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Batch 文档 5.2.2! |
运行作业
启动批处理作业至少需要两件事:Job
要启动,并JobOperator
.两者都可以包含在同一个
上下文或不同的上下文。例如,如果您从
命令行,则为每个Job
.因此,每个
工作有自己的JobOperator
.但是,如果
您从一个 Web 容器中运行,该容器位于HttpRequest
,通常有一个JobOperator
(配置为异步作业
launching),多个请求调用以启动其作业。
从命令行运行作业
如果要从企业运行作业
调度程序,命令行是主接口。这是因为
大多数调度器(Quartz 除外,除非使用NativeJob
)直接与作系统配合使用
进程,主要从 shell 脚本开始。有很多种方法。
启动 shell 脚本之外的 Java 进程,例如 Perl、Ruby 或
甚至构建工具,例如 Ant 或 Maven。然而,由于大多数人
熟悉 shell 脚本,本示例重点介绍它们。
The CommandLineJobOperator
因为启动作业的脚本必须启动一个 Java
Virtual Machine,需要有一个类,其中main
行动方法
作为主要入口点。Spring Batch 提供了一个实现
用于此目的:CommandLineJobOperator
.注意
这只是引导应用程序的一种方法。有
启动 Java 进程的多种方式,而此类绝不应该是
被视为确定的。这CommandLineJobOperator
执行四项任务:
-
加载适当的
ApplicationContext
. -
将命令行参数解析为
JobParameters
. -
根据参数找到适当的作业。
-
使用
JobOperator
在应用程序上下文中提供以启动作业。
所有这些任务都只需传入参数即可完成。 下表描述了所需的参数:
|
用于
创建一个 |
|
要在作业上执行的作的名称。可以是 [ |
|
根据作的不同,这可以是要启动的作业的名称,也可以是要停止、重新启动或放弃的作业的执行 ID。 |
启动作业时,这些参数后面的所有参数都被视为作业参数,将转换为JobParameters
对象
并且必须采用name=value
.在停止、重新启动或放弃作业的情况下,jobExecutionId
是
expected 作为第 4 个参数,并且所有剩余参数都将被忽略。
以下示例显示了作为作业参数传递给Java中定义的作业的日期:
<bash$ java CommandLineJobOperator io.spring.EndOfDayJobConfiguration start endOfDay schedule.date=2007-05-05,java.time.LocalDate
默认情况下,CommandLineJobOperator
使用DefaultJobParametersConverter
隐式转换
键/值对来标识作业参数。但是,您可以显式指定
哪些作业参数是标识的,哪些不是通过后缀它们来识别的true
或false
分别。
在以下示例中,schedule.date
是标识作业参数,而vendor.id
莫:
<bash$ java CommandLineJobOperator io.spring.EndOfDayJobConfiguration start endOfDay \
schedule.date=2007-05-05,java.time.LocalDate,true \
vendor.id=123,java.lang.Long,false
您可以通过设置自定义JobParametersConverter
在CommandLineJobOperator
.
退出代码
从命令行启动批处理作业时,企业
经常使用调度程序。大多数调度程序都相当愚蠢,只能工作
在过程层面。这意味着他们只知道一些
作系统进程(例如它们调用的 shell 脚本)。
在这种情况下,与调度程序通信的唯一方法
关于作业的成功或失败是通过返回代码。一个
返回代码是进程返回给调度程序的数字
以指示运行结果。在最简单的情况下,0 是
成功,1 是失败。但是,可能还有更复杂的
方案,例如“如果作业 A 返回 4,则启动作业 B,如果返回 5,则启动
下班 C。这种类型的行为是在调度程序级别配置的,
但重要的是,像 Spring Batch 这样的处理框架
提供一种返回退出代码的数字表示形式的方法
对于特定的批处理作业。在 Spring Batch 中,这是封装的
在ExitStatus
,其中涵盖了更多
详情见第 5 章。为了讨论退出代码,该
唯一需要知道的重要事情是ExitStatus
具有 Exit Code 属性,该属性为
由框架(或开发人员)设置,并作为JobExecution
从JobOperator
.这CommandLineJobOperator
转换此字符串值
通过使用ExitCodeMapper
接口:
public interface ExitCodeMapper {
int intValue(String exitCode);
}
基本契约ExitCodeMapper
是,给定一个字符串出口
code,将返回一个数字表示。默认实现
作业运行器使用的是SimpleJvmExitCodeMapper
返回 0 表示完成,1 表示通用错误,2 表示任何作业
运行器错误,例如无法找到Job
在提供的上下文中。如果还有的话
复杂度高于上述三个值,需要自定义
实现ExitCodeMapper
接口
必须通过将其设置为CommandLineJobOperator
.
从 Web 容器内运行作业
从历史上看,脱机处理(例如批处理作业)一直是
如前所述,从命令行启动。但是,有
在许多情况下,从HttpRequest
是
更好的选择。许多此类用例包括报告、临时作业
运行和 Web 应用程序支持。因为批处理作业(根据定义)
长期运行,最关心的是推出
异步作业:

本例中的控制器是 Spring MVC 控制器。请参阅
Spring Framework 参考指南,了解有关 Spring MVC 的更多信息。
控制器启动一个Job
通过使用JobOperator
已配置为异步启动,该
立即返回一个JobExecution
.这Job
可能仍在运行。然而,这个
非阻塞行为允许控制器立即返回,这
在处理HttpRequest
.以下列表
显示了一个示例:
@Controller
public class JobOperatorController {
@Autowired
JobOperator jobOperator;
@Autowired
Job job;
@RequestMapping("/jobOperator.html")
public void handle() throws Exception{
jobOperator.start(job, new JobParameters());
}
}