运行 Job
启动批处理作业至少需要两件事:Job
启动,并且JobLauncher
.两者都可以包含在同一个
context 或不同的上下文。例如,如果您从
命令行中,将为每个Job
.因此,每个
Job 有自己的JobLauncher
.但是,如果
您可以从 Web 容器中运行,该容器位于HttpRequest
,通常有一个JobLauncher
(针对异步作业配置
launching),多个请求调用以启动其作业。
从命令行运行 Job
如果要从企业运行作业
scheduler 中,命令行是主界面。这是因为
大多数调度器(Quartz 除外,除非使用NativeJob
) 直接与作系统配合使用
进程,主要由 shell 脚本启动。有很多方法
启动除 shell 脚本之外的 Java 进程,例如 Perl、Ruby 或
甚至构建工具,例如 Ant 或 Maven。但是,因为大多数人
熟悉 shell 脚本,本示例重点介绍它们。
The CommandLineJobRunner
因为启动作业的脚本必须启动 Java
Virtual Machine 中,需要有一个具有main
行动方法
作为主要入口点。Spring Batch 提供了一个实现
,用于以下目的:CommandLineJobRunner
.注意
这只是引导应用程序的一种方式。有
启动 Java 进程的方法有很多种,这个类绝不应该是
被视为确定的。这CommandLineJobRunner
执行四项任务:
-
加载适当的
ApplicationContext
. -
将命令行参数解析为
JobParameters
. -
根据参数找到合适的作业。
-
使用
JobLauncher
在应用程序上下文中提供以启动作业。
所有这些任务都只需传入参数即可完成。 下表描述了所需的参数:
|
XML 文件的位置,用于
创建一个 |
|
要运行的作业的名称。 |
必须传入这些参数,路径在前,名称在后。所有参数
在这些参数被视为作业参数后,将转换为JobParameters
对象
,并且必须采用name=value
.
-
Java
-
XML
以下示例显示了作为作业参数传递给 Java 中定义的作业的日期:
<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay schedule.date=2007-05-05,java.time.LocalDate
以下示例显示了作为作业参数传递给 XML 中定义的作业的日期:
<bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date=2007-05-05,java.time.LocalDate
默认情况下, 在以下示例中,
您可以通过使用自定义 |
-
Java
-
XML
在大多数情况下,您需要使用 manifest 来声明main
类。然而
为简单起见,该类被直接使用。此示例使用EndOfDay
来自 Batch 的域语言的示例。第一个
argument 是io.spring.EndOfDayJobConfiguration
,这是完全限定的类名
添加到包含 Job 的配置类中。第二个参数endOfDay
代表
作业名称。最后一个参数schedule.date=2007-05-05,java.time.LocalDate
,已转换
转换为JobParameter
Object 类型的java.time.LocalDate
.
以下示例显示了endOfDay
在 Java 中:
@Configuration
@EnableBatchProcessing
public class EndOfDayJobConfiguration {
@Bean
public Job endOfDay(JobRepository jobRepository, Step step1) {
return new JobBuilder("endOfDay", jobRepository)
.start(step1)
.build();
}
@Bean
public Step step1(JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("step1", jobRepository)
.tasklet((contribution, chunkContext) -> null, transactionManager)
.build();
}
}
在大多数情况下,您需要使用 manifest 来声明main
类。然而
为简单起见,该类被直接使用。此示例使用EndOfDay
来自 Batch 的域语言的示例。第一个
argument 是endOfDayJob.xml
,它是 Spring ApplicationContext,其中包含Job
.第二个参数endOfDay,
表示作业名称。最后一个参数schedule.date=2007-05-05,java.time.LocalDate
转换为JobParameter
Object 类型的java.time.LocalDate
.
以下示例显示了endOfDay
在 XML 中:
<job id="endOfDay">
<step id="step1" parent="simpleStep" />
</job>
<!-- Launcher details removed for clarity -->
<beans:bean id="jobLauncher"
class="org.springframework.batch.core.launch.support.TaskExecutorJobLauncher" />
前面的示例过于简单,因为
通常在 Spring Batch 中运行批处理作业,但它用于显示两个主要的
的要求CommandLineJobRunner
:Job
和JobLauncher
.
退出代码
从命令行启动批处理作业时,企业
经常使用 scheduler。大多数调度程序都相当愚蠢,只能工作
在流程级别。这意味着他们只知道一些
作系统进程(例如它们调用的 shell 脚本)。
在这种情况下,与调度程序通信的唯一方法
关于作业的成功或失败是通过返回代码。一个
return code 是进程返回给调度程序的数字
以指示运行结果。在最简单的情况下,0 是
成功,1 是失败。但是,可能还有更复杂的
场景,例如“如果作业 A 返回 4,则启动作业 B,如果作业返回 5,则启动作业 B
下班 C。这种类型的行为在调度程序级别配置,
但重要的是,像 Spring Batch 这样的处理框架
提供一种方法来返回退出代码的数字表示形式
对于特定的批处理作业。在 Spring Batch 中,这是封装的
在ExitStatus
,其中介绍了更多
详情见第 5 章。为了讨论退出代码,
唯一需要知道的是,ExitStatus
具有 exit code 属性,该属性为
设置,并作为JobExecution
从JobLauncher
.这CommandLineJobRunner
转换此字符串值
替换为一个数字ExitCodeMapper
接口:
public interface ExitCodeMapper {
public int intValue(String exitCode);
}
一个ExitCodeMapper
是那个,给定一个字符串 exit
code 时,将返回一个数字表示形式。默认的
Job Runner 使用的实现是SimpleJvmExitCodeMapper
,则返回 0 表示完成,1 表示一般错误,2 表示任何作业
运行器错误,例如找不到Job
在提供的上下文中。如果有更多
complex 的 3 个值,则自定义
实现ExitCodeMapper
接口
必须提供。因为CommandLineJobRunner
是创建
一ApplicationContext
因此,不能
'wired together' 时,任何需要覆盖的值都必须是
自动装配。这意味着,如果ExitCodeMapper
位于BeanFactory
,
在创建上下文后,它会注入到 Runner 中。都
这需要提供你自己的ExitCodeMapper
是声明 implementation
作为根级 Bean 进行,并确保它是ApplicationContext
由
跑步者。
从 Web 容器中运行作业
从历史上看,离线处理(例如批处理作业)一直是
从命令行启动,如前所述。但是,有
在许多情况下,从HttpRequest
是
一个更好的选择。许多此类用例包括报告、临时作业
running 和 Web 应用程序支持。因为批处理作业(根据定义)
运行时间长,最关心的是启动
job 异步:

在这种情况下,控制器是 Spring MVC 控制器。请参阅
Spring Framework 参考指南,了解有关 Spring MVC 的更多信息。
控制器会启动Job
通过使用JobLauncher
已配置为异步启动,该
立即返回一个JobExecution
.这Job
可能仍在运行。但是,此
非阻塞行为允许控制器立即返回,这
在处理HttpRequest
.以下清单
显示了一个例子:
@Controller
public class JobLauncherController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job job;
@RequestMapping("/jobLauncher.html")
public void handle() throws Exception{
jobLauncher.run(job, new JobParameters());
}
}