Spring batch是spring提供的批处理的框架,但不包括日程管理(schedule)的部分,最近项目用到,初试牛刀。
Spring Batch的核心概念
如下图,JobLancher启动job,一个job包含若干step,每个step又包含一个ItemReader(读数据),ItemProcessor(处理数据),和ItemWriter(输出数据),job的元数据和运行状态则存储在JobRepository中。
Job运行时概念
Job的一次完整运行称为一个JobInstance,由JobParameter区分(Spring认为相同的Job不应该多次运行),即如果JobParameter相同则为同一个Job,而一次运行如果中途失败或者抛异常,再次运行仍为一个JobInstance,而其中的每次运行称为一个JobExecution。
执行一个step称为StepExecution
关系如下:
Job 1->n JobInstance 1->n JobExecution 1->n StepExecution
JobExecution和StepExecution各包含一个ExecutionContext,其中存储了key-value对,可以用来存储运行状态。
实例
看spring自带的一个例子吧,billing,先看配置(有人说,spring是在用xml写代码,谁说不是呢?!并且xml没有语法检查的哦),
job配置
<job id="billingJob" restartable="true"> <step id="billingStep" next="payStep"> <tasklet start-limit="java.lang.Integer.MAX_VALUE"> <chunk reader="userDbReader" processor="billingProcessor" writer="billDbWriter" commit-interval="5" chunk-completion-policy=""> </chunk> </tasklet> </step> <step id="payStep"> <tasklet> <chunk reader="billDbReader" processor="payProcessor" writer="payDbWriter" commit-interval="5" chunk-completion-policy="" skip-limit="100"> <skippable-exception-classes> <include class="org.springframework.batch.sample.MoneyNotEnoughException" /> </skippable-exception-classes> </chunk> </tasklet> <next on="COMPLETED WITH SKIPS" to="messageStep"/> <listeners> <listener ref="payStepCheckingListener"></listener> </listeners> </step> <step id="messageStep"> <tasklet> <chunk reader="billArrearsDbReader" processor="messageProcessor" writer="messageDbWriter" commit-interval="5" chunk-completion-policy=""> </chunk> </tasklet> </step> </job><job>标签定义了一个job,其中有若干<step>,每个<step>又包含一个<tasklet>。
spring batch的write是一批批写入的,因此<tasklet>里面是<chunk>标签,commit-interval指定了批写入的大小,chunk-completion-policy指定什么情况下处理完成,默认是返回null。
该job的step有一个分支:
<next on="COMPLETED WITH SKIPS" to="messageStep"/>
当payStep,返回状态为:COMPLETED WITH SKIPS,则跳到messageStep执行。
监听,可以实现不同的接口监听item,task,job级别的处理这里payStepCheckingListener监听payStep的执行状态。
<skippable-exception-classes>,表示如果改step抛该异常时忽略,继续执行
由于spring batch已经实现了众多ItemReader和ItemWritter(从文件读写,从数据库读写等),因此基本上不用写实现他们的代码,配置好bean就好了。ItemProcessor是你需要实现的。
Job运行的参数
JobInstance是根据不同的参数来区分的,同一个JobInstance不能被多次启动。
另外可以在运行Job时,指定参数:
<bean id="cachingListener" class="org.jamee.demo.springbatch.CachingListener" scope="step"> <property name="logCount" value="#{jobParameters[logCount]}" /> </bean>
该logCount参数会在实例化时注入到cachingListener中,注意这里的scop="step",必须指定,以便延迟绑定,这个bean启动前才会实例化。
配置JobRepository
由于spring batch要把运行时信息写入到JobRepository,以便出错时可以重新从上次运行的地方启动,因此需要配置一个transaction-manager和data-source,job启动后,会在data-source创建一系列已BATCH_为前缀的表,记录Job运行状态和参数等。
<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> <beans:property name="dataSource" ref="dataSource" /> <beans:property name="transactionManager" ref="transactionManager" /> </beans:bean>
如果是测试环境,则可以配置为内存:
<beans:bean id="jobRepository" class="org.springframework.batch.core.repository.support.MapJobRepositoryFactoryBean"> <beans:property name="transactionManager" ref="transactionManager" /> </beans:bean> <beans:bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
启动Job
启动Job是通过JobLancher启动的,JobLancher是一个接口:
public interface JobLauncher { public JobExecution run(Job job, JobParameters jobParameters) throws JobExecutionAlreadyRunningException, JobRestartException; }Spring batch提供了一个SimpleJobLauncher启动job,注意setTaskExecutor方法设置了一个同步执行的executor,即可以设置异步或者并行的executor。
ClassPathXmlApplicationContext c = new ClassPathXmlApplicationContext( "billing_job.xml"); SimpleJobLauncher launcher = new SimpleJobLauncher(); launcher.setJobRepository((JobRepository) c.getBean("jobRepository")); launcher.setTaskExecutor(new SyncTaskExecutor()); try { Map<String, JobParameter> parameters = new HashMap<String, JobParameter>(); parameters.put(RUN_MONTH_KEY, new JobParameter("2011-2")); JobExecution je = launcher.run((Job) c.getBean("billingJob"), new JobParameters(parameters)); System.out.println(je); System.out.println(je.getJobInstance()); System.out.println(je.getStepExecutions()); } catch (Exception e) { e.printStackTrace(); }
相关推荐
Spring Batch是一个轻量级的,完全面向Spring的批处理框架,可以应用于企业级大量的数据处理系统。Spring Batch以POJO和大家熟知的Spring框架为基础,使开发者更容易的访问和利用企业级服务。Spring Batch可以提供...
Spring Batch是一个开源的轻量级、全面的批处理框架,它是为了解决企业应用中的大规模数据处理需求而设计的。Spring Batch in Action是一本专注于Spring Batch框架的书籍,由Arnaud Cogoluègnes、Thierry Templier...
在Java开发领域,Spring Boot和Spring Batch的整合是构建高效批处理系统的一种常见方式。Spring Boot以其简洁的配置和快速的启动能力深受开发者喜爱,而Spring Batch作为Spring框架的一部分,专注于批量处理任务,...
Quartz和Spring Batch是两种非常重要的Java开源框架,它们在企业级应用开发中扮演着重要角色。Quartz主要用于任务调度,而Spring Batch则专注于批量处理。在这个“quartz_springbatch_dynamic”项目中,我们将看到...
**Spring Batch 深度解析** Spring Batch 是一个强大的、全面的批处理框架,由 Spring 社区开发,旨在简化企业级应用中的批量数据处理任务。这个框架提供了一种标准的方式来处理大量的数据输入和输出,使得开发者...
Spring Batch是一个开源的轻量级批处理框架,它提供了一整套可复用的组件,用于构建健壮且高效的批处理应用程序。由于信息给定的【部分内容】并没有提供实际的技术细节,因此我将基于Spring Batch框架本身,详细介绍...
### 基于Spring Batch的大数据量并行处理 #### 概述 Spring Batch是一款用于高效处理大量数据的开源框架,特别适用于批处理任务。它由Spring Source与Accenture合作开发,结合了双方在批处理架构和技术上的优势,...
Work with all aspects of batch processing in a modern Java environment using a selection of Spring frameworks. This book provides up-to-date examples using the latest configuration techniques based on...
SpringBoot和SpringBatch是两个非常重要的Java开发框架,它们在企业级应用开发中扮演着重要角色。SpringBoot简化了Spring应用程序的配置和启动过程,而SpringBatch则专注于批处理任务,提供了一套全面且可扩展的解决...
Spring Batch 是一个强大的、全面的批处理框架,用于处理大量数据的处理任务。它由 Spring 框架提供支持,因此具有高度的可配置性和可扩展性,适用于各种企业级应用。Spring Batch 4.0.0 版本是该框架的一个重要版本...
Spring Batch API(Spring Batch 开发文档).CHM。 官网 Spring Batch API,Spring Batch 开发文档
Spring Batch 是一个强大的、可扩展的Java框架,专门用于处理批量数据处理任务,包括大量数据库数据的读取、处理和写入。它被设计为在企业级应用中处理大规模、高吞吐量的工作负载。本篇文章将深入探讨如何利用...
Spring Batch是一本介绍如何使用Spring Batch框架来构建批处理应用程序的专业书籍。在软件行业中,随着各种趋势的发展,例如基于Web的应用、面向服务的架构(SOA)以及事件驱动的应用,批处理应用程序虽然存在已久,...
mybatis、springBatch、mysql、quartz、spring、springMVC 部署说明: 本项目为两个数据库,由一个数据库的表向另外一个数据库的表做数据迁移,其中数据库脚本在:/src/main/resources/sql/下面(其中data_rep中的表...
Spring Batch 是一个强大的Java框架,专门用于处理批量数据处理任务。在Spring Batch中,分区处理是一种优化策略,它将大型工作负载分解成多个较小、独立的任务,这些任务可以在不同的线程或甚至不同的节点上并行...
Spring Batch 是一个强大的Java框架,专门用于处理批量数据处理任务。在给定的"Spring Batch 示例程序"中,我们可以深入探讨这个框架的核心概念和在实际应用中的使用方式。该示例程序采用的是Spring 3作为基础框架,...
Spring Batch是一个轻量级、全面的批处理框架,用于开发生产级的批处理应用,尤其是那些需要高效、可靠地处理大量数据的应用。Spring Batch提供了可重复使用的功能,这些功能在处理大量记录时非常重要,例如事务管理...
Spring Batch 是一个强大的、全面的批处理框架,用于处理大量数据。它被设计为高度可配置,能够处理各种批量处理任务,包括数据导入导出、日志分析、报表生成等。这个"Spring Batch学习demo项目源码"是针对Spring ...
### Spring Batch In Action #### 知识点一:Spring Batch 的简介 - **Spring Batch** 是一个基于 Java 的强大框架,专门设计用于处理大规模数据批处理任务。 - 它为开发人员提供了一套完整的工具来构建高效、可靠...
Quartz和SpringBatch是两种在Java开发中广泛使用的框架,Quartz用于任务调度,而SpringBatch则用于批量处理。在大型分布式系统中,结合这两者可以实现强大的定时任务集群功能,尤其是在需要对大量数据进行定时处理的...