
许多批处理问题都可以通过单线程、单进程作业来解决,因此在考虑更复杂的实现之前,最好先检查这些作业是否满足您的需要。衡量一份现实工作的表现,首先看看最简单的实现是否满足您的需求。即使使用标准硬件,您也可以在一分钟内读写数百MB的文件。
Spring Batch提供了一系列选项,本章对此进行了描述,尽管其他地方介绍了一些功能。在较高级别上,有两种并行处理模式:
这些也可分为以下几类:
启动并行处理的最简单方法是将TaskExecutor添加到步骤配置中。
使用java配置时,可以将TaskExecutor添加到步骤中,如下例所示:
只要需要并行化的应用程序逻辑可以划分为不同的职责并分配给各个步骤,那么它就可以在单个进程中并行化。并行步骤执行易于配置和使用。
使用java配置时,与step3并行执行步骤(step1、step2)非常简单绝芹虚,如下例所示:
在远程分块中,步骤处理被分割到多个进程中,通过一些中间件相互通信。下图显示了该模式:
manager组件是单个进程,Worker是多个远程进程。如果管理器不是瓶颈,则此模式效果最好,因此处理的成本必须高于读取项目的成本(在实践中经常如此)。
通过Spring集成,您可以完全控制进程的并发性(例如,通过使用QueueChannel而首悄不是DirectChannel)。此外,通过依赖Spring Integration丰富的通道适配器集合(如JMS和AMQP),您可以将批处理作业的块分发给外部系统进行处理。
具有要远程分块并燃的步骤的简单作业可能具有类似以下配置:
从版本4.1开始,Spring Batch Integration引入了@EnableBatchIntegration注释,可用于简化远程分块设置。此注释提供了两个可以在应用程序上下文中自动连接的bean:
RemoteChunkingManagerStepBuilderFactory:用于配置管理器步骤
RemoteChunkingWorkerBuilder:用于配置远程工作者集成流
这些API负责配置许多组件,如下图所述:
可以看到。Manager需要定义Reader。定义发送的消息通道,定义接收的消息通道。
这里面只定义了reader。好奇发出去的是什么?接收到的又是什么?
在RemoteChunkingManagerStepBuilder#build()中又添加了ChunkMessageChannelItemWriter相当于内部拼接了个完成的step。
那发出去的是啥?
发出去的ChunkRequest
整体流程可以概括如下:
远程分区是通过分区器partitioner来控制整体流程。真正的执行(包含reader这里是一个完整的step功能)不同于远程分块模块。
另一方面,当导致瓶颈的不是项目的处理而是相关的I/O时,远程分区很有用。使用远程分区,可以将工作分配给执行完整的Spring批处理步骤的工作人员。因此,每个worker都有自己的ItemReader、ItemProcessor和ItemWriter。为此,Spring Batch Integration提供了MessageChannelPartitionHandler。
PartitionHandler接口的这个实现使用MessageChannel实例向remote Worker发送指令并接收他们的响应。这为用于与remote Worker通信的传输(如JMS和AMQP例子用的是rabbitmq)提供了一个很好的抽象。
“可伸缩性”一章中涉及远程分区的部分概述了配置远程分区所需的概念和组件,并显示了使用默认TaskExecutionPartitionHandler在单独的本地执行线程中进行分区的示例。对于到多个JVM的远程分区,需要另外两个组件:
与远程分块类似,JMS/AMQP可以用作“远程处理结构”。在这种情况下,使用MessageChannelPartitionHandler实例作为PartitionHandler实现,如上所述。以下示例假定存在一个分区作业,并重点介绍MessageChannelPartitionHandler和JMS/AMQP配置:
可用于简化远程分区设置的@EnableBatchIntegration注释。此注释提供了两个对远程分区有用的bean:
RemotePartitioningManagerStepBuilderFactory:用于配置Manager步骤
RemotePartitioningWorkerStepBuilderFactory:用于配置Worker步骤
这些API负责配置许多组件,如下图所述:(使用db轮询模式)
Remote Partitioning Configuration (with replies aggregation)
在Manager方面,RemotePartitioningManagerStepBuilderFactory允许您通过声明以下内容来配Manager步骤:
无需显式配置MessageChannelPartitionHandler和MessagingTemplate(如果需要,仍然可以显式配置)。
在工作者方面,RemotePartitioningWorkersStepBuilderFactory允许您将工作者配置为:
无需显式配置StepExecutionRequestHandler(如果需要,可以显式配置)。
以下示例显示了如何使用这些API:
springbatch不写表?Spring Batch 数据库概论Spring Batch提供了表初始化的语句,并支持了多种常见的数据库,我们可以在配置文件中设置 spring.batch.initialize-schema 的值来指定对数据库的 *** 作。
embedded:如果不存在,创建一个空地库always:每次都重新创建新灶悔的库never:从不创建新的库默认的数据库文件地址在 /spring-batch-core-4.1.2.RELEASE.jar!/org/springframework/batch/core/schema-*.sql,根据不同的数据库类型,执行相应的脚本。
我们还可以通过 spring.batch.schema 指定SQL脚本的路径,通过 spring.batch.table-prefix 设置数据库表的前缀,默认是BATCH_ 开头。
#设置schema脚本的路径spring.batch.schema=org/springframework/batch/core/schema-mysql.sql#设置表前缀spring.batch.table-prefix=BATCH数据库表概论
执行完上边的脚本我们在数据库可以看到下边一个数据库表列表:
这些表可以分为三类:
JobInstanceBATCH_JOB_SEQBATCH_JOB_INSTANCEJobExecutionBATCH_JOB_EXECUTIONBATCH_JOB_EXECUTION_CONTEXTBATCH_JOB_EXECUTION_PARAMSBATCH_JOB_EXECUTION_SEQStepExecutionBATCH_STEP_EXECUTIONBATCH_STEP_EXECUTION_CONTEXTBATCH_JOB_EXECUTION_SEQ
数据库表详细介绍
BATCH_JOB_EXECUTION
job_execution_id: Job的执行ID,表主键version:当前记录被修改的次数,岁皮控制并发job_instance_id:Job 实例ID,同一个实例可能对应多条执行记录,但是一般只会对应一条执行成功记录,默认情况下JobName+参数 确定唯一的Job实例。create_time:记录创建时间start_time:Job开始执乎辩差行时间end_time:Job结束执行时间status:执行状态exit_code:退出码exit_message:退出信息last_update:最后更新日期job_configuration_location:BATCH_JOB_EXECUTION_CONTEXT
Batch执行上下文,记录batch执行中放入的一些参数数据
批处理任务是大多数IT项目的一个重要组成部分,批处理在业务系统中负责处理海量的数镇竖据,无须人工干预就能够自动高效的进行复杂的数据分析败旅乱和处理。批处理会定期读入批量数据,经过相应的业务处理进行归档的业务 *** 作,批处理的特征是自动执行,处理的数据量大,定时执行。将整个批处理的流程按逻辑划分可以分为读数据,处理数据和写数据。以下是整理的springbatch框架的简介知识,希望能帮助到大家。
springbatch对批处理本身的特性进行了抽象,将批处理作业抽象为job和jobstep,将批处理的处理过程分解为数据读,数据处理和数据写。
将异常处理机制分为跳过,重启和重试。将作业的分区分为多线程,并行远程和分区。
springbatch不是一个调度框架,但需要调度框架来配合完成批处理任务,它只关注批处理相关的任务问题,但没有提供相应的调度功能,如果需要使用调度功能,需要使用调度框架,这里介绍一个比较常用的调度框架quartz,可以配合springbatch完成批处理的任务调度。
springbatch的架构分为三层:基础架构层,核心层和应用层。应用层包含所有的批处理作业,核心层主要提供JobLauncher、Job和step,基础架构层主要提供通用的读(ItemReader)、写(ItemWriter)和服务处理(如:RetryTemplate重试模板;RepeatTemplate:重复模板),Spring
batch的三层架构体系使得Springbatch框架可以在不同的层级进行扩展,避免不同层级之间的相互影响。
job的介绍
批处理的作业是由一组step组成,同时job本身也是配置文件的顶级元素。每个作业都有自己的名字,可以定义step的执行顺序,以及定义作业是否可以重启。job执行的时候会生成一个jobinstance(作业实例)和一个察档jobexecution(作业执行器)。jobinstance包含执行job期间产生的数据以及job执行的状态信息;1个job可以对应多个jobinstance,1个jobinstance可以对应多个jobexecution。
job的配置的主要属性有id(作业的唯一标识)、job-repository(定义作业仓库)、incrementer(作业参数递增器)、restartable(作业是否重启)、parent(指定该作业的父作业)、abstract(定义作业是否抽象)。
step的介绍
step表示作业中一个完整的步骤,一个job可以由一个或者多个step组成,step主要负责批处理运行过程中的主要业务逻辑的实现。昌平镇电脑培训认为每次step执行的时候会生成一个或者多个jobexecution,每次任务执行失败的时候,等到下次重新执行该任务的时候就会为该任务的step重新生成一个stepexecution。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)