对于最新稳定版本,请使用Spring Batch Documentation 6.0.0spring-doc.cadn.net.cn

管理工作

至少,启动批处理作业需要两点:工作将发布并JobLauncher.两者都可以包含在同一个内部 语境或其他语境。例如,如果你从以下网站启动作业 命令行时,每个 JVM 都会实例化一个新的 JVM工作.因此,每个 工作本身就有它自己的JobLauncher.然而,如果 你是在一个位于HttpRequest通常有一个JobLauncher(配置为异步作业 启动),多个请求调用以启动它们的作业。spring-doc.cadn.net.cn

从命令行运行作业

如果你想从企业中运营你的工作, 调度器,命令行是主要接口。这是因为 大多数调度器(Quartz 除外,除非使用本地工作)直接与作系统协作 主要由shell脚本启动。有很多种方法 启动除shell脚本外的Java进程,如Perl、Ruby,或 甚至是建造工具,比如Ant或Maven。然而,因为大多数人 熟悉shell脚本,这个例子重点介绍了它们。spring-doc.cadn.net.cn

命令行作业跑者

因为启动作业的脚本必须启动 Java 虚拟机中需要一个类,其中主要行动方法 作为主要的切入点。Spring Batch 提供了一种实现 其目的是:命令行作业跑者.注意 这只是启动应用的一种方式。有 启动 Java 进程的方法有很多种,而这个类绝不应该是 被视为权威之作。这命令行作业跑者执行四项任务:spring-doc.cadn.net.cn

所有这些任务都只需通过传递的论证来完成。 下表描述了所需的参数:spring-doc.cadn.net.cn

表1。CommandLineJobRunner 参数

工作路径spring-doc.cadn.net.cn

用于 XML 文件的位置 创建一个应用上下文.这个文件 应该包含运行完整工作.spring-doc.cadn.net.cn

工作名称spring-doc.cadn.net.cn

要执行的任务名称。spring-doc.cadn.net.cn

这些参数必须先传递,路径排在前面,名称排在后。所有论点 在这些参数被视为作业参数后,被转换为作业参数对象 且格式必须为name=value.spring-doc.cadn.net.cn

以下示例展示了以 Java 定义的作业参数传递给作业的日期:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay schedule.date=2007-05-05,java.time.LocalDate

以下示例展示了作为作业参数传递给 XML 定义的作业的日期:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay schedule.date=2007-05-05,java.time.LocalDate

默认情况下,命令行作业跑者使用DefaultJobParameters转换器这隐含地转换 通过键值对来识别作业参数。不过,你可以明确说明 哪些作业参数是识别的,哪些不是,通过加以后缀truefalse分别。spring-doc.cadn.net.cn

在以下例子中,日程。日期是识别作业参数,而vendor.id莫:spring-doc.cadn.net.cn

<bash$ java CommandLineJobRunner endOfDayJob.xml endOfDay \
                                 schedule.date=2007-05-05,java.time.LocalDate,true \
                                 vendor.id=123,java.lang.Long,false
<bash$ java CommandLineJobRunner io.spring.EndOfDayJobConfiguration endOfDay \
                                 schedule.date=2007-05-05,java.time.LocalDate,true \
                                 vendor.id=123,java.lang.Long,false

你可以通过自定义来覆盖这个行为作业参数转换器.spring-doc.cadn.net.cn

在大多数情况下,你会想用清单来申报你的主要罐装的课程。然而 为了简化作,该职业被直接使用。这个例子使用了日终来自批处理领域语言的示例。第一 论元为io.spring.EndOfDayJobConfiguration,即完全限定的类别名称 映射到包含作业的配置类。第二个论点,一天结束代表 职位名称。最后的论点,schedule.date=2007-05-05,java.time.localDate,被转换为 变成了JobParameter类型的对象java.time.LocalDate.spring-doc.cadn.net.cn

下例展示了 的示例配置一天结束在爪哇语中:spring-doc.cadn.net.cn

@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();
    }
}

在大多数情况下,你会想用清单来申报你的主要罐装的课程。然而 为了简化作,该职业被直接使用。这个例子使用了日终来自批处理领域语言的示例。第一 论元为endOfDayJob.xml,是包含工作.第二个论点,一天结束,代表职位名称。最后的论点,schedule.date=2007-05-05,java.time.localDate,被转换为JobParameter类型的对象java.time.LocalDate.spring-doc.cadn.net.cn

下例展示了 的示例配置一天结束以XML形式表示:spring-doc.cadn.net.cn

<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 中运行批量作业,但它主要用于显示两个主要任务 要求命令行作业跑者:工作JobLauncher.spring-doc.cadn.net.cn

出口代码

当从命令行启动批处理作业时,企业 调度器经常被使用。大多数排班员都很笨,只做工作 在流程层面。这意味着他们只知道部分内容 作系统进程(例如他们调用的shell脚本)。 在这种情况下,唯一能与调度器通信的方式 关于工作成败的判断,是通过退货代码来判断的。一个 返回码是由进程返回给调度器的数字 用来表示该跑的结果。最简单的情况下,0 是 成功,1就是失败。不过,可能还有更复杂的情况 例如,“如果作业A返回4,则启动作业B,如果返回5,则踢出 离职C。”这种行为在调度器层面进行配置, 但像 Spring Batch 这样的处理框架非常重要 提供返回出口代码数值表示的方法 针对特定的批次作业。在春季批次中,这一过程被封装 在退出状态,该内容包含更多内容 详见第五章。为了讨论出口代码,以下内容 唯一重要的是退出状态具有一个出口代码属性,为 由框架(或开发者)设置,并作为作业执行从......JobLauncher.这命令行作业跑者转换该字符串值 通过使用ExitCodeMapper接口:spring-doc.cadn.net.cn

public interface ExitCodeMapper {

    public int intValue(String exitCode);

}

本质合同ExitCodeMapper给定字符串出口时,是 代码,会返回一个数字表示。默认 作业运行者使用的实现是SimpleJvmExitCodeMapper完成时返回0,通用错误返回1,任意作业返回2 跑者错误,比如找不到工作在所提供的语境下。甚至更多 需要比上述三个值更复杂的,需要自定义 实现ExitCodeMapper接口 必须提供。因为命令行作业跑者是创建的类 一应用上下文因此,不可能存在 “连接在一起”,任何需要覆盖的值必须是 自动接线。这意味着如果ExitCodeMapper豆子工厂, 在上下文创建后,它被注入运行器。都 这是必须完成的,才能提供属于你的ExitCodeMapper是声明实现 作为根级豆,并确保它是应用上下文负载为 跑步者。spring-doc.cadn.net.cn

在Web容器内运行作业

历史上,离线处理(如批处理作业)一直是 如前所述,从命令行启动。不过,有 许多情况下,从HttpRequest是 更好的选择。许多此类用例包括报表、临时作业 运行,以及网页应用支持。因为批处理作业(按定义) 长期运营,最重要的问题是启动 异步工作:spring-doc.cadn.net.cn

来自网页容器的异步作业Starters序列
图1。来自网页容器的异步作业Starters序列

这里的控制器是Spring MVC控制器。参见 关于春季MVC的更多信息,请参阅Spring Framework Reference Guide。 控制器发射工作通过使用JobLauncher该系统已配置为异步发射,且 立即返回作业执行.这工作很可能仍在运行。然而,这个 非阻塞行为允许控制器立即返回,且 在处理HttpRequest.以下列表 展示一个示例:spring-doc.cadn.net.cn

@Controller
public class JobLauncherController {

    @Autowired
    JobLauncher jobLauncher;

    @Autowired
    Job job;

    @RequestMapping("/jobLauncher.html")
    public void handle() throws Exception{
        jobLauncher.run(job, new JobParameters());
    }
}