Spring Batch 详解

Spring Batch 详解JobLauncher 和JobRepository 对应着的Java接口分别是:JobLauncher和JobRepositoryJobLauncher.packageorg.springframework.batch.core.launch;(…)publicinterfaceJobLauncher{publicJobExecutionrun(

大家好,又见面了,我是你们的朋友全栈君。

Job Launcher  Job Repository

 

对应着的Java接口分别是:JobLauncher JobRepository

JobLauncher.

packageorg.springframework.batch.core.launch;
(...)
publicinterface JobLauncher {
publicJobExecution run(Job job, JobParameters jobParameters)
throwsJobExecutionAlreadyRunningException,
JobRestartException,JobInstanceAlreadyCompleteException,
JobParametersInvalidException;
}

 

JobLauncher接口接受两个参数:JobJobParameters

调用这个Job Launcher方法:可以通过java程序来通过JobLauncher来启动,也可以通过定时任务例如Quartz scheduler来启动.

JobRepository

 

JobRepository保持着所有Job执行的相关元数据,JobRepositoryjava接口如下:

 

packageorg.springframework.batch.core.repository;
(...)
publicinterface JobRepository {
booleanisJobInstanceExists(String jobName, JobParametersjobParameters);
JobExecutioncreateJobExecution(
StringjobName, JobParameters jobParameters)
throwsJobExecutionAlreadyRunningException, JobRestartException,
JobInstanceAlreadyCompleteException;
voidupdate(JobExecution jobExecution);
voidadd(StepExecution stepExecution);
voidupdate(StepExecution stepExecution);
voidupdateExecutionContext(StepExecution stepExecution);
voidupdateExecutionContext(JobExecution jobExecution);
StepExecutiongetLastStepExecution(JobInstance jobInstance,
StringstepName);
intgetStepExecutionCount(JobInstance jobInstance, StringstepName);
JobExecutiongetLastJobExecution(String jobName,
JobParametersjobParameters);
}

JobRepository是上述处理提供的一种持久化机制,它为JobLauncher,Job,和Step实例提供CRUD操作。

JobRepository用于存储任务执行的状态信息,比如什么时间点执行了什么任务、任务执行结果如何等等。框架提供了2种实现,一种是通过Map形式保存在内存中,当Java程序重启后任务信息也就丢失了,并且在分布式下无法获取其他节点的任务执行情况;另一种是保存在数据库中,并且将数据保存在下面6张表里:

 

BATCH_JOB_INSTANCE
BATCH_JOB_EXECUTION_PARAMS
BATCH_JOB_EXECUTION
BATCH_STEP_EXECUTION
BATCH_JOB_EXECUTION_CONTEXT
BATCH_STEP_EXECUTION_CONTEXT

Spring Batch框架的JobRepository支持主流的数据库:DB2、Derby、H2、HSQLDB、MySQL、Oracle、PostgreSQL、SQLServer、Sybase。可爱的是,我司的Gauss数据库也是支持的,只不过需要稍加配置。

每个表的解析:http://blog.csdn.net/u011659172/article/details/50749534

 

 

一个job的启动通常是一个事件来进行触发的,我们会经常用到JobLauncher接口和JobParameters,但是这个事件是可以来自任何地方的,例如一个系统的定时器;一个http请求到web控制器来启动job等这就是Spring Batch 和外界的介入点.

另外批量Job程序基本上都是用来处理各种数据的,所以上图中我们可以看到SpringBatch的出口都是在跟数据源进行打交道,这些数据源可以是任何类型,但是文件系统和数据库是最常用的,当然它也可以支持写消息给JMS.

 

JobExecution

importorg.springframework.batch.core.JobExecution;
 
                                             jobParameters= new JobParametersBuilder()
                                                .addLong("time",System.currentTimeMillis())
                                                .addString("filePath",smsFilePath)
                                                .toJobParameters();
                                                JobExecutionjobExecution =jobLauncher.run(sms2DBJob,jobParameters);
                                                 if(jobExecution.getStatus() ==BatchStatus.COMPLETED) {
                                                                        returntrue;
                                                }

 

Job Execution表示Job执行的句柄,一次Job执行可能成功也可能失败。只有Job Execution执行成功之后,对应的Job Instance才能被完成。

 

Job Execution对应的数据库表是:BATCH_JOB_EXECUTION,

 

CREATE TABLEBATCH_JOB_EXECUTION  (
            JOB_EXECUTION_ID BIGINT  NOT NULL PRIMARY KEY ,
            VERSION BIGINT  ,
            JOB_INSTANCE_ID BIGINT NOT NULL,
            CREATE_TIME DATETIME NOT NULL,
            START_TIME DATETIME DEFAULT NULL ,
            END_TIME DATETIME DEFAULT NULL ,
            STATUS VARCHAR(10) ,
            EXIT_CODE VARCHAR(2500) ,
            EXIT_MESSAGE VARCHAR(2500) ,
            LAST_UPDATED DATETIME,
            JOB_CONFIGURATION_LOCATIONVARCHAR(2500) NULL,
            constraint JOB_INST_EXEC_FK foreignkey (JOB_INSTANCE_ID)
            referencesBATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
)ENGINE=InnoDB;

 

对应的java类是:org.springframework.batch.core.JobExecution

 

status :BatchStatus对象表示执行状态。BatchStatus.STARTED表示运行时,BatchStatus.FAILED表示执行失败,BatchStatus. COMPLETED表示任务成功结束

 

  

 JobParametersIncrementer主要用于JobOperator接口的startNextInstance等方法启动job的情况下。同一个Job在batch启动后被多次调用的场合,

   

startNextInstance方法将会非常有用,因为它将使用JobParametersIncrementer与Job绑定,创建一个新实例。因为JobParametersIncrementer有一个getNext方法

   

可以在此方法中为parameters添加一个自增的值,以区分不同的Job实例

    

,当然,这个值在job的其他的地方并不会用到,仅仅是为了标示不同JobInstance。当然SpringBatch框架也为我们提供了一个JobParametersIncrementer的实现类RunIdIncrementer

    

 

 

                

                      @Bean
                publicJob product2DBJob() {
                logger.info("product2DBJob");
               return productJobBuilderFactory.get("product2DBJob") //create ajobbuilder instance
                                      .incrementer(newRunIdIncrementer())
                                      .repository(jobRepository)                                                                                                       .listener(productJobCompletionNotificationListener())
                                       .flow(productStep())
                                       .end()
                                       .build();
                                 ------------------------------------------
                                  public Job build() {
                                FlowJobjob = new FlowJob();
                                job.setName(getName());
                                job.setFlow(flow);
                                super.enhance(job);
                                try{
                                                job.afterPropertiesSet();
                                }
                                catch(Exception e) {
                                                thrownew StepBuilderException(e);
                                }
                                returnjob;
                }
                                 
                                                                               
                }

 

@StepScope

主要用于 Spring Batch。 它本上是一个lazy scope,Spring在首次访问时bean。 在本例中, 需要使用

step scope 是因使用了job参数的 filePath,用程序启动时是不存在的。 使用 stepscope 使Spring

Batchbean找到filePath

 

 

弹性:

 

 

@Bean
          
           public Step userStep(){
              System.out.println("userStep!!!!!");
           return    stepBuilderFactory.get("userStep")
              .<User,Message>chunk(2)
              .reader(userReader(filePath))
              .processor(MessageProcessor())
              .writer(MessageWriter())
//                .faultTolerant() 
//                .retry(Exception.class)  不能跳过的错误
//               .noRetry(ParseException.class) 
//                .retryLimit(5)  最多可以让一条数据重试5次
//                .listener(newRetryFailuireItemListener())   
//                .skip(Exception.class)
//                .skipLimit(10)        
//                .taskExecutor(newSimpleAsyncTaskExecutor())
//                .throttleLimit(10)       
//               .transactionManager(transactionManager) 
                   .build();
           }
          
           /**skip(Exception.class)
            * skipLimit(10):跳过十次记录报错为Exception的记录,多余十次则Job失败
            * ----
            * retry(Exception.class)
            * noRetry(ParseException.class) 
            * retryLimit(5):一条记录有可能过几毫秒就可以运行成功,所以一条记录可以重试5次,但是如果一条记录包ParseException错误也就是数据本身的字段数目不对或者其他的原因则
            * 不会重试就相当于skiplimit+1,当报Exception时则重试最多五次,不成功然后跳过,这个需要和skiplimit联合使用不然job会失败
            */


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/140199.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • shell脚本给文件重命名_linux移动或重命名文件命令

    shell脚本给文件重命名_linux移动或重命名文件命令文件A重命名为BmvAB;

  • 可使用 git 操作的数据库 dolt

    可使用 git 操作的数据库 dolt什么是dolt?Dolt是一个SQL数据库,您可以像git存储库一样分叉、克隆、分支、合并、推送和拉取。像任何MySQL数据库一样连接到Dolt以使用SQL命令运行查询或更新数据,使用Golang语言编写。它与MySQL关系型数据库一样,具有表、视图等概念,支持数据的增删改查等操作。并且它提供了一个命令行工具,完美支持所有的git命令。…

    2022年10月22日
  • 字符串常量池深入解析[通俗易懂]

    字符串常量池深入解析[通俗易懂]字符串常量池字符串常量池概述一、Java中两种创建字符串对象的方式的分析。二、Intern的实现原理(JDK1.8)三、JDK1.7的Intern的执行四:几种特殊的情况的代码参考的部分文章概述  在分析字符串常量池之前,先来分析一下java的内存区域,然后再各种的情况分析一下各种情况下的情况;在《深入理解java虚拟机》这本书上是这样写的:对于H…

  • whith ~ as 用法[通俗易懂]

    whith ~ as 用法[通俗易懂]个人理解withself.client.get("/",catch_response=True)asresponse:其实就是response=self.clien

  • Python获取时间戳—学习笔记

    Python获取时间戳—学习笔记time模块importtimetime_str=time.strftime(‘%Y%m%d%H%M%S’)datetime模块importdatetimetime_str=datetime.datetime.now().strftime(‘%Y%m%d%H%M%S’)参考资料Python3学习笔记(十五):常用时间模块time和datetime…

  • Java 中哈希码的说明「建议收藏」

    Java 中哈希码的说明「建议收藏」在Java中,哈希码代表对象的特征。例如下面代码对象根据HashCode由此可得出str1!=str2,str1==str3哈希码产生的依据:哈希码并不是完全唯一的,它是一种算法,让同一个类的对象按照自己不同的特征尽量的有不同的哈希码,但不表示不同的对象哈希码完全不同。也有相同的情况,看程序员如何写哈希码的算法。1:Object类的hashCode.返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。2:String类的hashCode.根据String类包含的字符串的

    2022年10月26日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号