1. 環境準備1.1 引入依賴<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch" />

日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SpringBatch高階應用:大數據批處理框架實戰指南

來源: 責編: 時間:2024-05-07 09:12:51 228觀看
導讀本篇文章主要內容:通過Spring Batch從一個庫中讀取數據進過處理后寫入到另外一個庫中。
1. 環境準備1.1 引入依賴<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-batch

本篇文章主要內容:通過Spring Batch從一個庫中讀取數據進過處理后寫入到另外一個庫中。
ic028資訊網——每日最新資訊28at.com

1. 環境準備

1.1 引入依賴

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-batch</artifactId></dependency><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-jpa</artifactId></dependency>

2.2 配置Job

配置Job啟動器ic028資訊網——每日最新資訊28at.com

@BeanJobLauncher userJobLauncher(JobRepository userJobRepository) {  SimpleJobLauncher jobLauncher = new SimpleJobLauncher() ;  jobLauncher.setJobRepository(userJobRepository) ;  return jobLauncher ;}

配置任務Repository存儲元信息ic028資訊網——每日最新資訊28at.com

@BeanJobRepository userJobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) {  JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean() ;  factory.setDatabaseType("mysql") ;  factory.setTransactionManager(transactionManager) ;  factory.setDataSource(dataSource) ;  try {    factory.afterPropertiesSet() ;     return factory.getObject() ;  } catch (Exception e) {    throw new RuntimeException(e) ;  }}

配置ItemReader讀取器ic028資訊網——每日最新資訊28at.com

@BeanItemReader<User> userReader(JobOperator jobOperator) throws Exception {  JpaPagingItemReaderBuilder<User> builder = new JpaPagingItemReaderBuilder<>() ;  builder.entityManagerFactory(entityManagerFactory) ;  // 每次分頁查詢多少條數據  builder.pageSize(10) ;  builder.queryString("select u from User u where u.uid <= 50") ;  builder.saveState(true) ;  builder.name("userReader") ;  return builder.build() ;}

配置數據源,該數據源是用來寫入操作的ic028資訊網——每日最新資訊28at.com

public DataSource dataSource() {  HikariDataSource dataSource = new HikariDataSource() ;  dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/testjpa?serverTimezone=GMT%2B8&useSSL=false") ;  dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver") ;  dataSource.setUsername("root") ;  dataSource.setPassword("xxxooo") ;  return dataSource ;}

配置ItemWriter用來寫入操作(當前庫的數據寫入到另外一個庫,上面的數據源)ic028資訊網——每日最新資訊28at.com

@BeanItemWriter<User> userWriter() {  // 通過JDBC批量處理  JdbcBatchItemWriterBuilder<User> builder = new JdbcBatchItemWriterBuilder<>() ;  DataSource dataSource = dataSource() ;  builder.dataSource(dataSource) ;  builder.sql("insert into st (id, name, sex, mobile, age, birthday) values (?, ?, ?, ?, ?, ?)") ;  builder.itemPreparedStatementSetter(new ItemPreparedStatementSetter<User>() {    @Override    public void setValues(User item, PreparedStatement ps) throws SQLException {      ps.setInt(1, item.getUid()) ;      ps.setString(2, item.getName()) ;      ps.setString(3, item.getSex()) ;      ps.setString(4, item.getMobile()) ;      ps.setInt(5, item.getAge()) ;      ps.setObject(6, item.getBirthday()) ;    }  }) ;  return builder.build() ;}

配置ItemProcessor處理器,數據從當前庫讀取處理后經過處理后再寫入另外的庫中ic028資訊網——每日最新資訊28at.com

@BeanItemProcessor<User, User> userProcessor() {  return new ItemProcessor<User, User>() {    @Override    public User process(User item) throws Exception {      System.out.printf("%s - 開始處理數據:%s%n", Thread.currentThread().getName(), item.toString()) ;      // 模擬耗時操作      TimeUnit.SECONDS.sleep(1) ;      // 在這里你可以對數據進行相應的處理。      return item ;    }  } ;}

配置Step將ItemReader、ItemProcessor、ItemWriter串聯在一起。ic028資訊網——每日最新資訊28at.com

@BeanStep userStep1(ItemReader<User> userReader, ItemProcessor<User, User> userProcessor, ItemWriter<User> userWriter) {  return steps.get("userStep1")    .<User, User>chunk(5)    .reader(userReader)    .processor(userProcessor)    .writer(userWriter)    .build() ;}

配置Job,Job是封裝整個批處理流程的實體。在 Spring Batch 中,Job只是Step實例的容器。它將邏輯上屬于一個流程的多個步驟組合在一起,并允許對所有步驟的全局屬性(如可重啟性)進行配置。作業配置包含:ic028資訊網——每日最新資訊28at.com

  • 簡單的工作名稱。
  • Step實例的定義和排序。
  • Job是否可重新啟動。
@BeanJob userJob(Step userStep1, Step userStep2) {  return jobs.get("userJob").start(userStep1).build();}

以上是Spring Batch定義配置一個Job所需的核心組件。接下來會以上面的基礎配置進行高階知識點進行介紹。ic028資訊網——每日最新資訊28at.com

2. 高階配置管理

2.1 通過Controller接口啟動Job

@RequestMapping("/userJob")public class UserJobController {  @Resource  private JobLauncher userJobLauncher ;  @GetMapping("/start")  public Object start() throws Exception {    JobParameters jobParameters = new JobParameters() ;    this.userJobLauncher.run(userJob, jobParameters) ;    return "started" ;  }}

通過JobLauncher#run方法啟動Job。當你調用該接口時,你會發現接口一直不會返回,一直阻塞,下圖是Job的啟動序列ic028資訊網——每日最新資訊28at.com

圖片圖片ic028資訊網——每日最新資訊28at.com

根據上圖能知道,當你調用run方法后,會等待整個Job退出狀態為FINISHED或者FAILED后才能結束。所以,你需要異步完成,以便 SimpleJobLauncher 立即返回給調用者。而正確的序列應該是如下:ic028資訊網——每日最新資訊28at.com

圖片圖片ic028資訊網——每日最新資訊28at.com

上圖通過異步方式啟動Job序列。
ic028資訊網——每日最新資訊28at.com

2.2 異步啟動Job

@BeanTaskExecutor taskExecutor() {  ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor() ;  taskExecutor.setThreadNamePrefix("spring_batch_launcher") ;  taskExecutor.setCorePoolSize(10) ;  taskExecutor.setMaxPoolSize(10) ;  taskExecutor.initialize() ;   return taskExecutor ;}@BeanJobLauncher userJobLauncher(JobRepository userJobRepository) {  SimpleJobLauncher jobLauncher = new SimpleJobLauncher() ;  jobLauncher.setJobRepository(userJobRepository) ;  jobLauncher.setTaskExecutor(taskExecutor()) ;  return jobLauncher ;}

通過上面配置后,Job啟動將是異步的會直接返回JobExecution。ic028資訊網——每日最新資訊28at.com

2.3 重啟Job

當一個Job正在執行,由于斷電或者強制終止了程序。當程序恢復后你希望能夠接著程序終止前的進度繼續執行,這時候你需要進行如下的操作(本人沒有發現有什么API能夠操作的,可能文檔沒看仔細)。
ic028資訊網——每日最新資訊28at.com

當程序非正常終止是,下面兩張表的狀態都是STARTED,END_TIME為null
ic028資訊網——每日最新資訊28at.com

batch_job_execution表ic028資訊網——每日最新資訊28at.com

圖片圖片ic028資訊網——每日最新資訊28at.com

batch_step_execution表ic028資訊網——每日最新資訊28at.com

圖片圖片ic028資訊網——每日最新資訊28at.com

想要重新啟動必須將上面的狀態修改為STOPPED,END_TIME字段設置上值(是什么值無所謂)。ic028資訊網——每日最新資訊28at.com

然后我們就可以繼續使用上面的Controller接口啟動任務繼續執行了。ic028資訊網——每日最新資訊28at.com

2.4 多線程執行Step

為了加快程序的執行,我們可以為Step配置線程池
ic028資訊網——每日最新資訊28at.com

@BeanStep userStep1(ItemReader<User> userReader, ItemProcessor<User, User> userProcessor, ItemWriter<User> userWriter) {  return steps.get("userStep1")    .<User, User>chunk(5)    .reader(userReader)    .processor(userProcessor)    .writer(userWriter)    // 配置線程池    .taskExecutor(taskExecutor())    .build() ;}

注意:Step中使用的任何池化資源(如數據源)都可能對并發性設置限制。請確保這些資源池至少與步驟中所需的并發線程數一樣大。ic028資訊網——每日最新資訊28at.com

通過上面配置線程池后,你將在控制臺看到如下輸出。ic028資訊網——每日最新資訊28at.com

圖片圖片ic028資訊網——每日最新資訊28at.com

默認將有4個線程同時進行處理。可以通過如下配置進行調整ic028資訊網——每日最新資訊28at.com

@BeanStep userStep1(ItemReader<User> userReader, ItemProcessor<User, User> userProcessor, ItemWriter<User> userWriter) {  return steps.get("userStep1")      // ...      // 節流限制10,這里配置的大小應該與你的數據庫連接池大小及使用的線程池核心線程數一致。      .throttleLimit(10)      .build() ;}

2.5 重復啟動Job

要想重復啟動Job,我們可以在啟動Job時設置不同的JobParameters參數,只要參數不同那么就可以重復的啟動Job。如下示例:ic028資訊網——每日最新資訊28at.com

@GetMapping("/start/{page}")public Object start(@PathVariable("page") Long page) throws Exception {  Map<String, JobParameter> parameters = new HashMap<>() ;  // 每次設置的參數值不同即可。  parameters.put("page", new JobParameter(page)) ;  JobParameters jobParameters = new JobParameters(parameters) ;  this.userJobLauncher.run(userJob, jobParameters) ;  return "started" ;}

以上是本篇文章的全部內容,希望對你有幫助。ic028資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-87012-0.htmlSpringBatch高階應用:大數據批處理框架實戰指南

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 架構設計中如何應對接口級故障?

下一篇: Web Components 取代 Vue?我覺得不太行!

標簽:
  • 熱門焦點
  • 石頭自清潔掃拖機器人G10S評測:多年黑科技集大成之作 懶人終極福音

    科技圈經常能看到一個詞叫“縫合怪”,用來形容那些把好多功能或者外觀結合在一起的產品,通常這樣的詞是貶義詞,但如果真的是產品縫合的好、縫合的實用的話,那它就成了中性詞,今
  • 6月安卓手機性價比榜:Note 12 Turbo斷層式碾壓

    6月份有一個618,雖然這是京東周年慶的日子,但別的電商也都不約而同的跟進了,反正促銷沒壞處,廠商和用戶都能滿意。618期間一些產品也出現了歷史低價,那么各個價位段的產品性價比
  • K6:面向開發人員的現代負載測試工具

    K6 是一個開源負載測試工具,可以輕松編寫、運行和分析性能測試。它建立在 Go 和 JavaScript 之上,它被設計為功能強大、可擴展且易于使用。k6 可用于測試各種應用程序,包括 Web
  • 之家push系統迭代之路

    前言在這個信息爆炸的互聯網時代,能夠及時準確獲取信息是當今社會要解決的關鍵問題之一。隨著之家用戶體量和內容規模的不斷增大,傳統的靠"主動拉"獲取信息的方式已不能滿足用
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 猿輔導與新東方的兩種“歸途”

    作者|卓心月 出品|零態LT(ID:LingTai_LT)如何成為一家偉大企業?答案一定是對&ldquo;勢&rdquo;的把握,這其中最關鍵的當屬對企業戰略的制定,且能夠站在未來看現在,即使這其中的
  • 微博大門常打開,迎接海外畫師漂洋東渡

    作者:互聯網那些事&ldquo;起猛了,我能看得懂日語了&rdquo;。&ldquo;為什么日本人說話我能聽懂?&rdquo;&ldquo;中文不像中文,日語不像日語,但是我竟然看懂了&rdquo;&hellip;&hell
  • 首發天璣9200+ iQOO Neo8系列發布首銷售價2299元起

    2023年5月23日晚,iQOO Neo8系列正式發布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強悍登場,限時售價3099元起;價位段最強性能手機iQOO Neo8同期上市
  • 由于成本持續增加,筆記本產品價格預計將明顯上漲

    根據知情人士透露,由于材料、物流等成本持續增加,筆記本產品價格預計將在2021年下半年有明顯上漲。進入6月下旬以來,全球半導體芯片缺貨情況加劇,顯卡、處理器
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
国产精品视频| 一本高清dvd不卡在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲乱码国产乱码精品精可以看 | 麻豆精品视频在线观看| 久久国产直播| 免费欧美日韩| 欧美精品自拍| 国产精品一区三区| 国内精品久久久久影院薰衣草| 国内外成人免费激情在线视频网站 | 欧美日韩成人一区| 欧美三区在线| 国产日韩欧美不卡在线| 亚洲国产精品一区二区第四页av| **网站欧美大片在线观看| 亚洲激情第一区| 亚洲视频在线观看免费| 午夜精品视频在线观看| 久久手机免费观看| 欧美日韩123| 国际精品欧美精品| 日韩视频永久免费观看| 午夜精品成人在线| 欧美 日韩 国产一区二区在线视频| 欧美日韩国产123区| 国产一区二区毛片| 亚洲伦理网站| 久久久99爱| 欧美婷婷六月丁香综合色| 精品二区视频| 亚洲一级免费视频| 免费欧美在线视频| 国产一区二区三区在线观看免费| 日韩一级片网址| 久久久久在线观看| 国产精品一级在线| 亚洲免费av网站| 老司机午夜精品| 国产亚洲精品久久久| 一区二区三区日韩在线观看| 久久这里只有| 国产综合色产在线精品| 午夜综合激情| 国产精品v欧美精品v日韩| 亚洲国产精品黑人久久久| 欧美在线播放一区| 国产精品网红福利| 亚洲一区二区高清视频| 欧美日韩高清不卡| 亚洲精选久久| 欧美日韩免费在线观看| 亚洲精品一区二区三区av| 久久精品视频在线播放| 国产视频一区在线观看| 国产精品进线69影院| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美日韩一级片在线观看| 最新日韩中文字幕| 欧美激情一区在线观看| 日韩视频在线一区二区三区| 欧美国产欧美综合| 一卡二卡3卡四卡高清精品视频| 欧美精品成人一区二区在线观看 | 亚洲制服少妇| 国产午夜精品在线观看| 篠田优中文在线播放第一区| 国产精品福利av| 亚洲欧美日韩精品| 国产亚洲激情| 欧美成在线观看| 亚洲网站在线播放| 国内精品伊人久久久久av一坑| 米奇777在线欧美播放| 亚洲青涩在线| 国产精品国产精品国产专区不蜜| 午夜国产精品影院在线观看 | 久久久精品999| 亚洲精品在线观看免费| 国产精一区二区三区| 久久久久亚洲综合| 中文亚洲视频在线| 一区二区三区在线高清| 欧美三级日本三级少妇99| 久久久久久久综合色一本| 999在线观看精品免费不卡网站| 国产欧美亚洲日本| 欧美激情黄色片| 久久久欧美精品sm网站| 在线亚洲伦理| 亚洲人成人一区二区在线观看| 国产欧亚日韩视频| 欧美日韩综合不卡| 你懂的国产精品| 欧美在线观看www| 亚洲视频在线一区| 日韩视频在线播放| 亚洲国产福利在线| 狠色狠色综合久久| 国产精品嫩草久久久久| 欧美激情久久久久久| 久久久久欧美精品| 欧美在线看片| 午夜久久久久久| 在线视频精品一区| 亚洲全部视频| 亚洲国产高清一区| 国语自产精品视频在线看抢先版结局 | 国产精品久久久久久户外露出| 麻豆精品视频在线| 久久国产婷婷国产香蕉| 欧美一区二区成人6969| 中文国产成人精品| 日韩亚洲欧美成人| 日韩一级二级三级| 日韩午夜av电影| 亚洲最新在线| 在线一区亚洲| 亚洲在线日韩| 欧美一区二区三区在线看| 欧美一区二区三区四区在线观看| 亚洲欧美日韩在线播放| 亚洲男女自偷自拍图片另类| 亚洲免费视频中文字幕| 亚洲欧美日韩一区二区| 一区二区三区国产盗摄| 亚洲一级免费视频| 久久av在线看| 欧美粗暴jizz性欧美20| 欧美日本三区| 国产精品成人v| 国产一区二区av| 亚洲国产精品第一区二区| 亚洲精选在线| 久久国产精品99国产精| 欧美成人有码| 国产精品午夜在线| 一区二区三区无毛| 一本一本久久a久久精品牛牛影视| 亚洲一区在线直播| 久久精品国产96久久久香蕉| 快射av在线播放一区| 国产精品久久77777| 在线观看国产成人av片| 夜夜爽夜夜爽精品视频| 午夜在线电影亚洲一区| 欧美肥婆在线| 国产亚洲精品7777| 亚洲乱码久久| 久久一区二区精品| 国产精品卡一卡二| 国产精品午夜久久| 亚洲人成网站777色婷婷| 欧美尤物一区| 欧美性久久久| 揄拍成人国产精品视频| 亚洲欧美在线高清| 欧美午夜片在线观看| 国产综合精品一区| 中日韩美女免费视频网站在线观看| 亚洲欧美国产制服动漫| 欧美成人小视频| 在线观看亚洲视频| 久久久久88色偷偷免费| 欧美午夜久久久| 99热免费精品| 欧美电影打屁股sp| 亚洲国产精品成人一区二区 | 一本久久a久久免费精品不卡| 久久夜色精品国产欧美乱| 国产精品美女久久久免费| 99国产精品99久久久久久| 免费在线一区二区| 在线免费观看日本一区| 久久天天狠狠| 亚洲第一级黄色片| 欧美成人午夜免费视在线看片| 在线日本欧美| 欧美精品成人| 一区二区国产精品| 欧美三区在线视频| 一本久久综合亚洲鲁鲁五月天| 欧美激情女人20p| 亚洲精品久久久久久下一站| 欧美高清视频一区| 一区二区在线观看视频在线观看| 久久久精品tv| 在线精品国精品国产尤物884a| 另类尿喷潮videofree| 亚洲精品日韩一| 国产精品丝袜白浆摸在线| 久久精品首页| 最新国产成人在线观看| 国产精品日韩精品欧美精品| 欧美在线不卡视频| 亚洲欧洲一区二区在线播放| 国产精品av一区二区| 欧美一区二区视频观看视频| 亚洲国产成人高清精品| 国产精品任我爽爆在线播放| 久久久久国内| 亚洲视频久久| 91久久久精品| 国产女主播一区二区|