游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

SpringBatch批处理框架,真的强啊

  springbatch简介
  springbatch是spring提供的一个数据处理框架。企业域中的许多应用程序需要批量处理才能在关键任务环境中执行业务操作。这些业务运营包括:无需用户交互即可最有效地处理大量信息的自动化,复杂处理。这些操作通常包括基于时间的事件(例如月末计算,通知或通信)。在非常大的数据集中重复处理复杂业务规则的定期应用(例如,保险利益确定或费率调整)。集成从内部和外部系统接收的信息,这些信息通常需要以事务方式格式化,验证和处理到记录系统中。批处理用于每天为企业处理数十亿的交易。
  SpringBatch是一个轻量级,全面的批处理框架,旨在开发对企业系统日常运营至关重要的强大批处理应用程序。SpringBatch构建了人们期望的SpringFramework特性(生产力,基于POJO的开发方法和一般易用性),同时使开发人员可以在必要时轻松访问和利用更高级的企业服务。SpringBatch不是一个schuedling的框架。
  SpringBatch提供了可重用的功能,这些功能对于处理大量的数据至关重要,包括记录跟踪,事务管理,作业处理统计,作业重启,跳过和资源管理。它还提供更高级的技术服务和功能,通过优化和分区技术实现极高容量和高性能的批处理作业。
  SpringBatch可用于两种简单的用例(例如将文件读入数据库或运行存储过程)以及复杂的大量用例(例如在数据库之间移动大量数据,转换它等等)上)。大批量批处理作业可以高度可扩展的方式利用该框架来处理大量信息。SpringBatch架构介绍
  一个典型的批处理应用程序大致如下:从数据库,文件或队列中读取大量记录。以某种方式处理数据。以修改之后的形式写回数据。
  其对应的示意图如下:
  springbatch的一个总体的架构如下:
  在springbatch中一个job可以定义很多的步骤step,在每一个step里面可以定义其专属的ItemReader用于读取数据,ItemProcesseor用于处理数据,ItemWriter用于写数据,而每一个定义的job则都在JobRepository里面,我们可以通过JobLauncher来启动某一个job。SpringBatch核心概念介绍
  下面是一些概念是Springbatch框架中的核心概念。什么是Job
  Job和Step是springbatch执行批处理任务最为核心的两个概念。
  其中Job是一个封装整个批处理过程的一个概念。Job在springbatch的体系当中只是一个最顶层的一个抽象概念,体现在代码当中则它只是一个最上层的接口,其代码如下:Batchdomainobjectrepresentingajob。Jobisanexplicitabstractionrepresentingtheconfigurationofajobspecifiedbyadeveloper。Itshouldbenotedthatrestartpolicyisappliedtothejobasawholeandnottoastep。publicinterfaceJob{StringgetName();booleanisRestartable();voidexecute(JobExecutionexecution);JobParametersIncrementergetJobParametersIncrementer();JobParametersValidatorgetJobParametersValidator();}
  在Job这个接口当中定义了五个方法,它的实现类主要有两种类型的job,一个是simplejob,另一个是flowjob。在springbatch当中,job是最顶层的抽象,除job之外我们还有JobInstance以及JobExecution这两个更加底层的抽象。
  一个job是我们运行的基本单位,它内部由step组成。job本质上可以看成step的一个容器。一个job可以按照指定的逻辑顺序组合step,并提供了我们给所有step设置相同属性的方法,例如一些事件监听,跳过策略。
  SpringBatch以SimpleJob类的形式提供了Job接口的默认简单实现,它在Job之上创建了一些标准功能。一个使用javaconfig的例子代码如下:BeanpublicJobfootballJob(){returnthis。jobBuilderFactory。get(footballJob)。start(playerLoad())。next(gameLoad())。next(playerSummarization())。end()。build();}
  这个配置的意思是:首先给这个job起了一个名字叫footballJob,接着指定了这个job的三个step,他们分别由方法,playerLoad,gameLoad,playerSummarization实现。什么是JobInstance
  我们在上文已经提到了JobInstance,他是Job的更加底层的一个抽象,他的定义如下:publicinterfaceJobInstance{GetuniqueidforthisJobInstance。returninstanceidpubliclonggetInstanceId();Getjobname。returnvalueofidattributefromjobpublicStringgetJobName();}
  他的方法很简单,一个是返回Job的id,另一个是返回Job的名字。
  JobInstance指的是job运行当中,作业执行过程当中的概念。Instance本就是实例的意思。
  比如说现在有一个批处理的job,它的功能是在一天结束时执行行一次。我们假定这个批处理job的名字为EndOfDay。在这个情况下,那么每天就会有一个逻辑意义上的JobInstance,而我们必须记录job的每次运行的情况。什么是JobParameters
  在上文当中我们提到了,同一个job每天运行一次的话,那么每天都有一个jobIntsance,但他们的job定义都是一样的,那么我们怎么来区别一个job的不同jobinstance了。不妨先做个猜想,虽然jobinstance的job定义一样,但是他们有的东西就不一样,例如运行时间。
  springbatch中提供的用来标识一个jobinstance的东西是:JobParameters。JobParameters对象包含一组用于启动批处理作业的参数,它可以在运行期间用于识别或甚至用作参考数据。我们假设的运行时间,就可以作为一个JobParameters。
  例如,我们前面的EndOfDay的job现在已经有了两个实例,一个产生于1月1日,另一个产生于1月2日,那么我们就可以定义两个JobParameter对象:一个的参数是0101,另一个的参数是0102。因此,识别一个JobInstance的方法可以定义为:
  因此,我么可以通过Jobparameter来操作正确的JobInstance什么是JobExecution
  JobExecution指的是单次尝试运行一个我们定义好的Job的代码层面的概念。job的一次执行可能以失败也可能成功。只有当执行成功完成时,给定的与执行相对应的JobInstance才也被视为完成。
  还是以前面描述的EndOfDay的job作为示例,假设第一次运行01012019的JobInstance结果是失败。那么此时如果使用与第一次运行相同的Jobparameter参数(即01012019)作业参数再次运行,那么就会创建一个对应于之前jobInstance的一个新的JobExecution实例,JobInstance仍然只有一个。
  JobExecution的接口定义如下:publicinterfaceJobExecution{GetuniqueidforthisJobExecution。returnexecutionidpubliclonggetExecutionId();Getjobname。returnvalueofidattributefromjobpublicStringgetJobName();Getbatchstatusofthisexecution。returnbatchstatusvalue。publicBatchStatusgetBatchStatus();GettimeexecutionenteredSTARTEDstatus。returndate(time)publicDategetStartTime();Gettimeexecutionenteredendstatus:COMPLETED,STOPPED,FAILEDreturndate(time)publicDategetEndTime();Getexecutionexitstatus。returnexitstatus。publicStringgetExitStatus();Gettimeexecutionwascreated。returndate(time)publicDategetCreateTime();Gettimeexecutionwaslastupdatedupdated。returndate(time)publicDategetLastUpdatedTime();Getjobparametersforthisexecution。returnjobparameterspublicPropertiesgetJobParameters();}
  每一个方法的注释已经解释的很清楚,这里不再多做解释。只提一下BatchStatus,JobExecution当中提供了一个方法getBatchStatus用于获取一个job某一次特地执行的一个状态。BatchStatus是一个代表job状态的枚举类,其定义如下:publicenumBatchStatus{STARTING,STARTED,STOPPING,STOPPED,FAILED,COMPLETED,ABANDONED}
  这些属性对于一个job的执行来说是非常关键的信息,并且springbatch会将他们持久到数据库当中。在使用Springbatch的过程当中springbatch会自动创建一些表用于存储一些job相关的信息,用于存储JobExecution的表为batchjobexecution,下面是一个从数据库当中截图的实例:
  什么是Step
  每一个Step对象都封装了批处理作业的一个独立的阶段。事实上,每一个Job本质上都是由一个或多个步骤组成。每一个step包含定义和控制实际批处理所需的所有信息。任何特定的内容都由编写Job的开发人员自行决定。
  一个step可以非常简单也可以非常复杂。例如,一个step的功能是将文件中的数据加载到数据库中,那么基于现在springbatch的支持则几乎不需要写代码。更复杂的step可能具有复杂的业务逻辑,这些逻辑作为处理的一部分。
  与Job一样,Step具有与JobExecution类似的StepExecution,如下图所示:
  什么是StepExecution
  StepExecution表示一次执行Step,每次运行一个Step时都会创建一个新的StepExecution,类似于JobExecution。但是,某个步骤可能由于其之前的步骤失败而无法执行。且仅当Step实际启动时才会创建StepExecution。
  一次step执行的实例由StepExecution类的对象表示。每个StepExecution都包含对其相应步骤的引用以及JobExecution和事务相关的数据,例如提交和回滚计数以及开始和结束时间。
  此外,每个步骤执行都包含一个ExecutionContext,其中包含开发人员需要在批处理运行中保留的任何数据,例如重新启动所需的统计信息或状态信息。下面是一个从数据库当中截图的实例:
  什么是ExecutionContext
  ExecutionContext即每一个StepExecution的执行环境。它包含一系列的键值对。我们可以用如下代码获取ExecutionContextExecutionContextecStepstepExecution。getExecutionContext();ExecutionContextecJobjobExecution。getExecutionContext();什么是JobRepository
  JobRepository是一个用于将上述job,step等概念进行持久化的一个类。它同时给Job和Step以及下文会提到的JobLauncher实现提供CRUD操作。
  首次启动Job时,将从repository中获取JobExecution,并且在执行批处理的过程中,StepExecution和JobExecution将被存储到repository当中。
  EnableBatchProcessing注解可以为JobRepository提供自动配置。什么是JobLauncher
  JobLauncher这个接口的功能非常简单,它是用于启动指定了JobParameters的Job,为什么这里要强调指定了JobParameter,原因其实我们在前面已经提到了,jobparameter和job一起才能组成一次job的执行。下面是代码实例:publicinterfaceJobLauncher{publicJobExecutionrun(Jobjob,JobParametersjobParameters)throwsJobExecutionAlreadyRunningException,JobRestartException,JobInstanceAlreadyCompleteException,JobParametersInvalidException;}
  上面run方法实现的功能是根据传入的job以及jobparamaters从JobRepository获取一个JobExecution并执行Job。什么是ItemReader
  ItemReader是一个读数据的抽象,它的功能是为每一个Step提供数据输入。当ItemReader以及读完所有数据时,它会返回null来告诉后续操作数据已经读完。SpringBatch为ItemReader提供了非常多的有用的实现类,比如JdbcPagingItemReader,JdbcCursorItemReader等等。
  ItemReader支持的读入的数据源也是非常丰富的,包括各种类型的数据库,文件,数据流,等等。几乎涵盖了我们的所有场景。
  下面是一个JdbcPagingItemReader的例子代码:BeanpublicJdbcPagingItemReaderitemReader(DataSourcedataSource,PagingQueryProviderqueryProvider){MapString,ObjectparameterValuesnewHashMap();parameterValues。put(status,NEW);returnnewJdbcPagingItemReaderBuilderCustomerCredit()。name(creditReader)。dataSource(dataSource)。queryProvider(queryProvider)。parameterValues(parameterValues)。rowMapper(customerCreditMapper())。pageSize(1000)。build();}BeanpublicSqlPagingQueryProviderFactoryBeanqueryProvider(){SqlPagingQueryProviderFactoryBeanprovidernewSqlPagingQueryProviderFactoryBean();provider。setSelectClause(selectid,name,credit);provider。setFromClause(fromcustomer);provider。setWhereClause(wherestatus:status);provider。setSortKey(id);returnprovider;}
  JdbcPagingItemReader必须指定一个PagingQueryProvider,负责提供SQL查询语句来按分页返回数据。
  下面是一个JdbcCursorItemReader的例子代码:privateJdbcCursorItemReaderMapString,ObjectbuildItemReader(finalDataSourcedataSource,StringtableName,Stringtenant){JdbcCursorItemReaderMapString,ObjectitemReadernewJdbcCursorItemReader();itemReader。setDataSource(dataSource);itemReader。setSql(sqlhere);itemReader。setRowMapper(newRowMapper());returnitemReader;}什么是ItemWriter
  既然ItemReader是读数据的一个抽象,那么ItemWriter自然就是一个写数据的抽象,它是为每一个step提供数据写出的功能。写的单位是可以配置的,我们可以一次写一条数据,也可以一次写一个chunk的数据,关于chunk下文会有专门的介绍。ItemWriter对于读入的数据是不能做任何操作的。
  SpringBatch为ItemWriter也提供了非常多的有用的实现类,当然我们也可以去实现自己的writer功能。什么是ItemProcessor
  ItemProcessor对项目的业务逻辑处理的一个抽象,当ItemReader读取到一条记录之后,ItemWriter还未写入这条记录之前,I我们可以借助temProcessor提供一个处理业务逻辑的功能,并对数据进行相应操作。如果我们在ItemProcessor发现一条数据不应该被写入,可以通过返回null来表示。ItemProcessor和ItemReader以及ItemWriter可以非常好的结合在一起工作,他们之间的数据传输也非常方便。我们直接使用即可。chunk处理流程
  springbatch提供了让我们按照chunk处理数据的能力,一个chunk的示意图如下:
  它的意思就和图示的一样,由于我们一次batch的任务可能会有很多的数据读写操作,因此一条一条的处理并向数据库提交的话效率不会很高,因此springbatch提供了chunk这个概念,我们可以设定一个chunksize,springbatch将一条一条处理数据,但不提交到数据库,只有当处理的数据数量达到chunksize设定的值得时候,才一起去commit。
  java的实例定义代码如下:
  在上面这个step里面,chunksize被设为了10,当ItemReader读的数据数量达到10的时候,这一批次的数据就一起被传到itemWriter,同时transaction被提交。skip策略和失败处理
  一个batch的job的step,可能会处理非常大数量的数据,难免会遇到出错的情况,出错的情况虽出现的概率较小,但是我们不得不考虑这些情况,因为我们做数据迁移最重要的是要保证数据的最终一致性。springbatch当然也考虑到了这种情况,并且为我们提供了相关的技术支持,请看如下bean的配置:
  我们需要留意这三个方法,分别是skipLimit(),skip(),noSkip(),
  skipLimit方法的意思是我们可以设定一个我们允许的这个step可以跳过的异常数量,假如我们设定为10,则当这个step运行时,只要出现的异常数目不超过10,整个step都不会fail。注意,若不设定skipLimit,则其默认值是0。
  skip方法我们可以指定我们可以跳过的异常,因为有些异常的出现,我们是可以忽略的。
  noSkip方法的意思则是指出现这个异常我们不想跳过,也就是从skip的所以exception当中排除这个exception,从上面的例子来说,也就是跳过所有除FileNotFoundException的exception。
  那么对于这个step来说,FileNotFoundException就是一个fatal的exception,抛出这个exception的时候step就会直接fail。批处理操作指南
  本部分是一些使用springbatch时的值得注意的点批处理原则在构建批处理解决方案时,应考虑以下关键原则和注意事项。批处理体系结构通常会影响体系结构尽可能简化并避免在单批应用程序中构建复杂的逻辑结构保持数据的处理和存储在物理上靠得很近(换句话说,将数据保存在处理过程中)。最大限度地减少系统资源的使用,尤其是IO。在internalmemory中执行尽可能多的操作。查看应用程序IO(分析SQL语句)以确保避免不必要的物理IO。特别是,需要寻找以下四个常见缺陷:当数据可以被读取一次并缓存或保存在工作存储中时,读取每个事务的数据。重新读取先前在同一事务中读取数据的事务的数据。导致不必要的表或索引扫描。未在SQL语句的WHERE子句中指定键值。在批处理运行中不要做两次一样的事情。例如,如果需要数据汇总以用于报告目的,则应该(如果可能)在最初处理数据时递增存储的总计,因此您的报告应用程序不必重新处理相同的数据。在批处理应用程序开始时分配足够的内存,以避免在此过程中进行耗时的重新分配。总是假设数据完整性最差。插入适当的检查和记录验证以维护数据完整性。尽可能实施校验和以进行内部验证。例如,对于一个文件里的数据应该有一个数据条数纪录,告诉文件中的记录总数以及关键字段的汇总。在具有真实数据量的类似生产环境中尽早计划和执行压力测试。在大批量系统中,数据备份可能具有挑战性,特别是如果系统以247在线的情况运行。数据库备份通常在在线设计中得到很好的处理,但文件备份应该被视为同样重要。如果系统依赖于文件,则文件备份过程不仅应该到位并记录在案,还应定期进行测试。如何默认不启动job
  在使用javaconfig使用springbatch的job时,如果不做任何配置,项目在启动时就会默认去跑我们定义好的批处理job。那么如何让项目在启动时不自动去跑job呢?
  springbatch的job会在项目启动时自动run,如果我们不想让他在启动时run的话,可以在application。properties中添加如下属性:spring。batch。job。enabledfalse在读数据时内存不够
  在使用springbatch做数据迁移时,发现在job启动后,执行到一定时间点时就卡在一个地方不动了,且log也不再打印,等待一段时间之后,得到如下错误:
  红字的信息为:Resourceexhaustionevent:theJVMwasunabletoallocatememoryfromtheheap。
  翻译过来的意思就是项目发出了一个资源耗尽的事件,告诉我们java虚拟机无法再为堆分配内存。
  造成这个错误的原因是:这个项目里的batchjob的reader是一次性拿回了数据库里的所有数据,并没有进行分页,当这个数据量太大时,就会导致内存不够用。解决的办法有两个:调整reader读数据逻辑,按分页读取,但实现上会麻烦一些,且运行效率会下降增大service内存

毛泽东称赞敬爱的战友不朽的英雄,王若飞一生短暂灿烂提起王若飞,人们都会想起他在重庆谈判的归程遇难的不幸,或多或少了解他为祖国事业抛头颅洒热血,可是,对他的了解大多浮于表面,并没有深入地体会到他浓浓的爱党之情。王若飞生于1……电影我的英雄聚焦女子拳击范冰冰景珂两大影后出拳PK星关系7月24日讯日前,由西安华颂影视文化传媒有限公司出品,樊昊仑导演,景珂、连晋领衔主演,巴多、白露娜、霍亚明、彭波等主演的《我的英雄》在7月23日全球曝光首款拳套心脏主题元……于正旗下演员张译兮主演电影全国公映搭档赵今麦星关系11月12日讯2019年11月12日,知名编剧、制片人于正旗下欢娱影视签约的00后演员张译兮主演的电影《小轿车》将在全国公映。该片从现实主义视角,反应了农村儿童缺乏……2021年性价比手机推荐,499起步1。红米9A232G499464G5994128G7996128G999老人机,或者给孩子备用。这个手机能干嘛?打电话,上微信,打开支……RealD与海上明珠影业签约建立亚洲首家全影城RealDCi星关系8月22日讯(2019年8月21日),北京及洛杉矶全球3D与影像技术公司RealD与海上明珠影业股份有限公司今天宣布已签署合约,将位于上海的环球港影城升级改造为含Real……张丹峰燕赤霞猎妖传被换角释小龙与徐冬冬组全新CP星关系4月27日讯近日,原定由张丹峰、徐冬冬领衔主演的古装玄幻院线电影《燕赤霞猎妖传》正式开机,但在开机当日,男一号已由张丹峰换成了释小龙,片方称张丹峰因个人原因无法继续参与拍……苹果研发屏下FaceID?网友这才是终极全面屏技术2017年9月份,苹果发布了iPhoneX,在iPhone上首次使用上了FaceID技术,也因为这个技术,给手机界带来了刘海屏。而苹果iPhoneX发布后,国产机一边吐槽……过春天导演白雪亮相海南岛电影节对话电影大师分享最前卫青春片星关系12月17日讯12月16日,电影《过春天》导演白雪现身首届海南岛国际电影节闭幕典礼,并受邀参加大师嘉年华、青年导演论坛等活动,与努里比格锡兰、约翰尼德普、朱丽叶诺什、阿尔……从4599跌至2699,曲面屏12256G,骁龙865低调离来到下半年之后手机市场即将迎来新一轮的竞争,各大厂商的年度旗舰蓄势待发,骁龙888Plus相信会是标配,而现在骁龙888和骁龙870都有着不同程度的降价,更不用说去年发布的骁龙……物流业新工种一个人一天帮公司省下10万元在人工智能调度引擎的协助下,胡功苗管理着62条发车路线和20个线路承运商。在运力部门协作下,每天为转运中心省下10万元。天下网商记者蒋菲2017年,中国社会物流总费……最懂观众的王晶大嫂三大看点精彩出击由王晶监制的网络电影《大嫂》正在爱奇艺热播,该片是王晶继续聚焦九龙城寨,启用《追龙》原班人马打造的一部女性上位复仇记。影片讲述的是徐冬冬饰演的左兰屡遭凌辱后遇到贵人罪哥,终于掌……2017年压轴黑马王晶新作大嫂点击破千万近日,王晶新作《大嫂》登陆爱奇艺,这部讲述香港奇女子江湖沉浮史的网络电影一上线就吸引了众多网友的关注,截止12月10日下午16时,点击量破1100万。《大嫂》以堪比院线电影的胶……
别克和雪佛兰车型命名的差异,是否影响了两个品牌的销量呢?从威朗Pro到昂科威s、昂科威Plus,别克在对其越来越多细分产品的推出上,似乎找到了一个简便让大家了解其新旧产品关系的好办法,那就是:借助手机企业对产品型号的命名规则,来降低……如何在不滚动滚轮的情况下在iOS15上设置闹钟Apple在iPhone上设置闹钟的默认方法是使用滚轮而不是数字键盘,但您可以暂时更改它。Apple喜欢和你赌,赌你几点起床。在iPhone上,您可以通过旋转轮子上的数字……BowersampampampWilkins800钻石系列荣如何让世界上最成功的经典高端扬声器系列再上一个台阶?过去6年里,这是Steyning研发中心(SRE)全球知名音响品牌BowersWilkins(宝华韦健)工程设计团队的所在地……新中国成立后乌鲁木齐首任市长,他两次入党三次入狱四次婚姻两次入党、三次入狱、四次婚姻与蒋经国是八拜之交还是新中国成立后乌鲁木齐首任市长历经挫折,精忠报国他就是屈武两次入党屈武是陕西渭南人,生于18……手游手柄如何选?四大主流品牌PK告诉你,小米华为iPhone相信大家都喜欢用手机玩游戏,手机玩游戏相比电脑来说是方便,但是如果想要体验更好,我们还需要配上一款适合的手柄!面对市面上众多手柄,很多人都无从选择。今天我们就选取了手游手……凡尔赛C5X武汉首秀,东风雪铁龙引领潮流不将就5月20日,第十九届华中国际车展在武汉正式启幕,东风雪铁龙携旗下全新旗舰车型凡尔赛C5X、2021款天逸、天逸百年款、C6、C3XR等众多车型强势参展,打造了一场关于潮流与舒适……山西交通职业技术学院(太原小店区)山西交通职业技术学院位于山西省太原市小店区,隶属于山西省交通厅管理,其前身为山西省交通学校,建校于1958年,2000年批准为国家级重点中专学校,2001年经省政府批准升格为高……关于30系列显卡买不到,老程有话要说等等党们再坚持坚持导读这段时间很多小伙伴找我打听30系列显卡什么时候铺货到市场,关于这个问题,老程现在基本上会天天骚扰一下市场里面的经销商,尤其是影驰在临沂地区的代理商,基本上我每天都会发……OnexPlayer壹号掌机惊艳亮相微软Windows11媒2021年10月12日,微软在京举行与你所爱,更进一步为主题的Windows11新一代PC媒体品鉴会,现场邀请了包括政府、财经、科技、消费电子等多领域的媒体,通过主题演讲和场景……比特币价格在4万美元上下徘徊,但衍生品数据仍然看涨比特币正向4万美元的水平靠拢,但衍生品数据显示,交易员对比特币持中立或看涨的立场。自9月7日比特币的价格仅用两小时从52952美元的高点跌至42800美元低点以来,比特币……66W超级快充120Hz全视屏荣耀Play5活力版正式发布,10月25日晚,荣耀召开新品发布会,正式发布荣耀Play5系列新品荣耀Play5活力版。荣耀Play5活力版支持66W超级快充,配备6。67英寸120Hz全视屏,同时支持640……原创我读平凡的世界作者吕文玲网络文学文学交流专注原创原创作品授权天美五星全网发布文章阅读也可在微信读书上检索此文我读《平凡的世界》作者吕文玲编审天美五星(写于2020。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网