电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Spring Batch遠程分區的本地Jar包模式的代碼詳解

瀏覽:13日期:2023-08-14 14:35:11

1 前言

Spring Batch遠程分區對于大量數據的處理非常擅長,它的實現有多種方式,如本地Jar包模式、MQ模式、Kubernetes模式。這三種模式的如下:

(1)本地Jar包模式:分區處理的worker為一個Java進程,從jar包啟動,通過jvm參數和數據庫傳遞參數;官方提供示例代碼。

(2)MQ模式:worker是一個常駐進程,Manager和Worker通過消息隊列來傳遞參數;網上有不少相關示例代碼。

(3)Kubernetes模式:worker為K8s中的Pod,Manager直接啟動Pod來處理;網上并沒有找到任何示例代碼。

本文將通過代碼來講解第一種模式(本地Jar包模式),其它后續再介紹。

Spring Batch遠程分區的本地Jar包模式的代碼詳解

建議先看下面文章了解一下:

Spring Batch入門:Spring Batch入門教程篇

Spring Batch并行處理介紹:詳解SpringBoot和SpringBatch 使用

2 代碼講解

本文代碼中,Manager和Worker是放在一起的,在同一個項目里,也只會打一個jar包而已;我們通過profile來區別是manager還是worker,也就是通過Spring Profile實現一份代碼,兩份邏輯。實際上也可以拆成兩份代碼,但放一起更方便測試,而且代碼量不大,就沒有必要了。

2.1 項目準備

2.1.1 數據庫

首先我們需要準備一個數據庫,因為Manager和Worker都需要同步狀態到DB上,不能直接使用嵌入式的內存數據庫了,需要一個外部可共同訪問的數據庫。這里我使用的是H2 Database,安裝可參考:把H2數據庫從jar包部署到Kubernetes,并解決Ingress不支持TCP的問題。

2.1.2 引入依賴

maven引入依賴如下所示:

<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch</artifactId></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-task</artifactId></dependency><dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope></dependency><dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-deployer-local</artifactId> <version>2.4.1</version></dependency><dependency> <groupId>org.springframework.batch</groupId> <artifactId>spring-batch-integration</artifactId></dependency>

spring-cloud-deployer-local用于部署和啟動worker,非常關鍵;其它就是Spring Batch和Task相關的依賴;以及數據庫連接。

2.1.3 主類入口

Springboot的主類入口如下:

@EnableTask@SpringBootApplication@EnableBatchProcessingpublic class PkslowRemotePartitionJar { public static void main(String[] args) { SpringApplication.run(PkslowRemotePartitionJar.class, args); }}

在Springboot的基礎上,添加了Spring Batch和Spring Cloud Task的支持。

2.2 關鍵代碼編寫

前面的數據庫搭建和其它代碼沒有太多可講的,接下來就開始關鍵代碼的編寫。

2.2.1 分區管理Partitioner

Partitioner是遠程分區中的核心bean,它定義了分成多少個區、怎么分區,要把什么變量傳遞給worker。它會返回一組<分區名,執行上下文>的鍵值對,即返回Map<String, ExecutionContext>。把要傳遞給worker的變量放在ExecutionContext中去,支持多種類型的變量,如String、int、long等。實際上,我們不建議通過ExecutionContext來傳遞太多數據;可以傳遞一些標識或主鍵,然后worker自己去拿數據即可。

具體代碼如下:

private static final int GRID_SIZE = 4;@Beanpublic Partitioner partitioner() { return new Partitioner() { @Override public Map<String, ExecutionContext> partition(int gridSize) { Map<String, ExecutionContext> partitions = new HashMap<>(gridSize); for (int i = 0; i < GRID_SIZE; i++) { ExecutionContext executionContext = new ExecutionContext(); executionContext.put('partitionNumber', i); partitions.put('partition' + i, executionContext); } return partitions; } };}

上面分成4個區,程序會啟動4個worker來處理;給worker傳遞的參數是partitionNumber。

2.2.2 分區處理器PartitionHandler

PartitionHandler也是核心的bean,它決定了怎么去啟動worker,給它們傳遞什么jvm參數(跟之前的ExecutionContext傳遞不一樣)。

@Beanpublic PartitionHandler partitionHandler(TaskLauncher taskLauncher, JobExplorer jobExplorer, TaskRepository taskRepository) throws Exception { Resource resource = this.resourceLoader.getResource(workerResource); DeployerPartitionHandler partitionHandler = new DeployerPartitionHandler(taskLauncher, jobExplorer, resource, 'workerStep', taskRepository); List<String> commandLineArgs = new ArrayList<>(3); commandLineArgs.add('--spring.profiles.active=worker'); commandLineArgs.add('--spring.cloud.task.initialize-enabled=false'); commandLineArgs.add('--spring.batch.initializer.enabled=false'); partitionHandler .setCommandLineArgsProvider(new PassThroughCommandLineArgsProvider(commandLineArgs)); partitionHandler .setEnvironmentVariablesProvider(new SimpleEnvironmentVariablesProvider(this.environment)); partitionHandler.setMaxWorkers(2); partitionHandler.setApplicationName('PkslowWorkerJob'); return partitionHandler;}

上面代碼中:

resource是worker的jar包地址,表示將啟動該程序;

workerStep是worker將要執行的step;

commandLineArgs定義了啟動worker的jvm參數,如--spring.profiles.active=worker;

environment是manager的系統環境變量,可以傳遞給worker,當然也可以選擇不傳遞;

MaxWorkers是最多能同時啟動多少個worker,類似于線程池大小;設置為2,表示最多同時有2個worker來處理4個分區。

2.2.3 Manager和Worker的Batch定義

完成了分區相關的代碼,剩下的就只是如何定義Manager和Worker的業務代碼了。

Manager作為管理者,不用太多業務邏輯,代碼如下:

@Bean@Profile('!worker')public Job partitionedJob(PartitionHandler partitionHandler) throws Exception { Random random = new Random(); return this.jobBuilderFactory.get('partitionedJob' + random.nextInt()) .start(step1(partitionHandler)) .build();}@Beanpublic Step step1(PartitionHandler partitionHandler) throws Exception { return this.stepBuilderFactory.get('step1') .partitioner(workerStep().getName(), partitioner()) .step(workerStep()) .partitionHandler(partitionHandler) .build();}

Worker主要作用是處理數據,是我們的業務代碼,這里就演示一下如何獲取Manager傳遞過來的partitionNumber:

@Beanpublic Step workerStep() { return this.stepBuilderFactory.get('workerStep') .tasklet(workerTasklet(null, null)) .build();}@Bean@StepScopepublic Tasklet workerTasklet(final @Value('#{stepExecutionContext[’partitionNumber’]}') Integer partitionNumber) { return new Tasklet() { @Override public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception { Thread.sleep(6000); //增加延時,查看效果,通過jps:在jar情況下會新起java進程 System.out.println('This tasklet ran partition: ' + partitionNumber); return RepeatStatus.FINISHED; } };}

通過表達式@Value('#{stepExecutionContext[’partitionNumber’]}') 獲取Manager傳遞過來的變量;注意要加注解@StepScope。

3 程序運行

因為我們分為Manager和Worker,但都是同一份代碼,所以我們先打包一個jar出來,不然manager無法啟動。配置數據庫和Worker的jar包地址如下:

spring.datasource.url=jdbc:h2:tcp://localhost:9092/testspring.datasource.username=pkslowspring.datasource.password=pkslowspring.datasource.driver-class-name=org.h2.Driverpkslow.worker.resource=file://pkslow/target/remote-partitioning-jar-1.0-SNAPSHOT.jar

執行程序如下:

Spring Batch遠程分區的本地Jar包模式的代碼詳解

可以看到啟動了4次Java程序,還給出日志路徑。

通過jps命令查看,能看到一個Manager進程,還有兩個worker進程:

Spring Batch遠程分區的本地Jar包模式的代碼詳解

4 復雜變量傳遞

前面講了Manager可以通過ExecutionContext傳遞變量,如簡單的String、long等。但其實它也是可以傳遞復雜的Java對象的,但對應的類需要可序列化,如:

import java.io.Serializable;public class Person implements Serializable { private Integer age; private String name; private String webSite; //getter and setter}

Manager傳遞:

executionContext.put('person', new Person(0, 'pkslow', 'www.pkslow.com'));

Worker接收:

@Value('#{stepExecutionContext[’person’]}') Person person

5 總結

本文介紹了Spring Batch遠程分區的本地Jar包模式,只能在一臺機器上運行,所以也是無法真正發揮出遠程分區的作用。但它對我們后續理解更復雜的模式是有很大幫助的;同時,我們也可以使用本地模式進行開發測試,畢竟它只需要一個數據庫就行了,依賴很少。

標簽: Spring
相關文章:
主站蜘蛛池模板: 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 氢氧化钙设备, 氢氧化钙生产线-淄博惠琛工贸有限公司 | 天津散热器_天津暖气片_天津安尼威尔散热器制造有限公司 | 耐磨焊丝,堆焊焊丝,耐磨药芯焊丝,碳化钨焊丝-北京耐默公司 | 12cr1mov无缝钢管切割-15crmog无缝钢管切割-40cr无缝钢管切割-42crmo无缝钢管切割-Q345B无缝钢管切割-45#无缝钢管切割 - 聊城宽达钢管有限公司 | 卓能JOINTLEAN端子连接器厂家-专业提供PCB接线端子|轨道式端子|重载连接器|欧式连接器等电气连接产品和服务 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 合肥角钢_合肥槽钢_安徽镀锌管厂家-昆瑟商贸有限公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 武汉刮刮奖_刮刮卡印刷厂_为企业提供门票印刷_武汉合格证印刷_现金劵代金券印刷制作 - 武汉泽雅印刷有限公司 | 智成电子深圳tdk一级代理-提供TDK电容电感贴片蜂鸣器磁芯lambda电源代理经销,TDK代理商有哪些TDK一级代理商排名查询。-深圳tdk一级代理 | 耙式干燥机_真空耙式干燥机厂家-无锡鹏茂化工装备有限公司 | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 山东PE给水管厂家,山东双壁波纹管,山东钢带增强波纹管,山东PE穿线管,山东PE农田灌溉管,山东MPP电力保护套管-山东德诺塑业有限公司 | 广州冷却塔维修厂家_冷却塔修理_凉水塔风机电机填料抢修-广东康明节能空调有限公司 | 钢化玻璃膜|手机钢化膜|钢化膜厂家|手机保护膜-【东莞市大象电子科技有限公司】 | 蓝莓施肥机,智能施肥机,自动施肥机,水肥一体化项目,水肥一体机厂家,小型施肥机,圣大节水,滴灌施工方案,山东圣大节水科技有限公司官网17864474793 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 单锥双螺旋混合机_双螺旋锥形混合机-无锡新洋设备科技有限公司 | 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 校服厂家,英伦校服定做工厂,园服生产定制厂商-东莞市艾咪天使校服 | 卫生人才网-中国专业的医疗卫生医学人才网招聘网站! | 2025世界机器人大会_IC China_半导体展_集成电路博览会_智能制造展览网 | 喷码机,激光喷码打码机,鸡蛋打码机,手持打码机,自动喷码机,一物一码防伪溯源-恒欣瑞达有限公司 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 拖链电缆_柔性电缆_伺服电缆_坦克链电缆-深圳市顺电工业电缆有限公司 | 山楂片_雪花_迷你山楂片_山楂条饼厂家-青州市丰源食品厂 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 北京银联移动POS机办理_收银POS机_智能pos机_刷卡机_收银系统_个人POS机-谷骐科技【官网】 | 润滑脂-高温润滑脂-轴承润滑脂-食品级润滑油-索科润滑油脂厂家 | 细石混凝土泵_厂家_价格-烟台九达机械有限公司 | 塑料撕碎机_编织袋撕碎机_废纸撕碎机_生活垃圾撕碎机_废铁破碎机_河南鑫世昌机械制造有限公司 | 今日扫码_溯源二维码_产品防伪一物一码_红包墙营销方案 | 福建成考网-福建成人高考网| 北京征地律师,征地拆迁律师,专业拆迁律师,北京拆迁律师,征地纠纷律师,征地诉讼律师,征地拆迁补偿,拆迁律师 - 北京凯诺律师事务所 | 挖掘机挖斗和铲斗生产厂家选择徐州崛起机械制造有限公司 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 水质监测站_水质在线分析仪_水质自动监测系统_多参数水质在线监测仪_水质传感器-山东万象环境科技有限公司 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 |