精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

SpringBatch高階應(yīng)用:大數(shù)據(jù)批處理框架實(shí)戰(zhàn)指南

開發(fā) 前端
配置Job,Job是封裝整個批處理流程的實(shí)體。在 Spring Batch 中,Job只是Step實(shí)例的容器。它將邏輯上屬于一個流程的多個步驟組合在一起,并允許對所有步驟的全局屬性(如可重啟性)進(jìn)行配置。

本篇文章主要內(nèi)容:通過Spring Batch從一個庫中讀取數(shù)據(jù)進(jìn)過處理后寫入到另外一個庫中。

1. 環(huán)境準(zhǔn)備

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啟動器

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

配置任務(wù)Repository存儲元信息

@Bean
JobRepository 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讀取器

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

配置數(shù)據(jù)源,該數(shù)據(jù)源是用來寫入操作的

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用來寫入操作(當(dāng)前庫的數(shù)據(jù)寫入到另外一個庫,上面的數(shù)據(jù)源)

@Bean
ItemWriter<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處理器,數(shù)據(jù)從當(dāng)前庫讀取處理后經(jīng)過處理后再寫入另外的庫中

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

配置Step將ItemReader、ItemProcessor、ItemWriter串聯(lián)在一起。

@Bean
Step 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是封裝整個批處理流程的實(shí)體。在 Spring Batch 中,Job只是Step實(shí)例的容器。它將邏輯上屬于一個流程的多個步驟組合在一起,并允許對所有步驟的全局屬性(如可重啟性)進(jìn)行配置。作業(yè)配置包含:

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

以上是Spring Batch定義配置一個Job所需的核心組件。接下來會以上面的基礎(chǔ)配置進(jìn)行高階知識點(diǎn)進(jìn)行介紹。

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。當(dāng)你調(diào)用該接口時,你會發(fā)現(xiàn)接口一直不會返回,一直阻塞,下圖是Job的啟動序列

圖片圖片

根據(jù)上圖能知道,當(dāng)你調(diào)用run方法后,會等待整個Job退出狀態(tài)為FINISHED或者FAILED后才能結(jié)束。所以,你需要異步完成,以便 SimpleJobLauncher 立即返回給調(diào)用者。而正確的序列應(yīng)該是如下:

圖片圖片

上圖通過異步方式啟動Job序列。

2.2 異步啟動Job

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

通過上面配置后,Job啟動將是異步的會直接返回JobExecution。

2.3 重啟Job

當(dāng)一個Job正在執(zhí)行,由于斷電或者強(qiáng)制終止了程序。當(dāng)程序恢復(fù)后你希望能夠接著程序終止前的進(jìn)度繼續(xù)執(zhí)行,這時候你需要進(jìn)行如下的操作(本人沒有發(fā)現(xiàn)有什么API能夠操作的,可能文檔沒看仔細(xì))。

當(dāng)程序非正常終止是,下面兩張表的狀態(tài)都是STARTED,END_TIME為null

batch_job_execution表

圖片圖片

batch_step_execution表

圖片圖片

想要重新啟動必須將上面的狀態(tài)修改為STOPPED,END_TIME字段設(shè)置上值(是什么值無所謂)。

然后我們就可以繼續(xù)使用上面的Controller接口啟動任務(wù)繼續(xù)執(zhí)行了。

2.4 多線程執(zhí)行Step

為了加快程序的執(zhí)行,我們可以為Step配置線程池

@Bean
Step 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中使用的任何池化資源(如數(shù)據(jù)源)都可能對并發(fā)性設(shè)置限制。請確保這些資源池至少與步驟中所需的并發(fā)線程數(shù)一樣大。

通過上面配置線程池后,你將在控制臺看到如下輸出。

圖片圖片

默認(rèn)將有4個線程同時進(jìn)行處理。可以通過如下配置進(jìn)行調(diào)整

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

2.5 重復(fù)啟動Job

要想重復(fù)啟動Job,我們可以在啟動Job時設(shè)置不同的JobParameters參數(shù),只要參數(shù)不同那么就可以重復(fù)的啟動Job。如下示例:

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

以上是本篇文章的全部內(nèi)容,希望對你有幫助。

責(zé)任編輯:武曉燕 來源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-12-27 14:45:59

2023-08-22 08:01:42

SpringBatch事務(wù)管理

2017-01-12 14:50:15

大數(shù)據(jù)Spring Batc框架

2012-02-20 09:49:42

ibmdw

2016-11-15 09:44:21

大數(shù)據(jù)批處理流處理

2022-08-02 20:47:38

Spring框架應(yīng)用程序

2015-06-25 13:06:48

大數(shù)據(jù)從選擇到應(yīng)用

2025-07-29 02:00:00

2022-03-07 14:39:01

前端框架批處理

2016-12-18 15:03:57

Python Scikit Lea數(shù)據(jù)

2020-10-26 07:05:02

大數(shù)據(jù)管道編排編排框架

2018-04-03 10:33:15

大數(shù)據(jù)

2017-09-06 17:05:54

大數(shù)據(jù)處理流程處理框架

2022-03-01 08:40:34

StormHadoop批處理

2016-12-20 16:07:13

Python數(shù)據(jù)預(yù)處理

2025-07-10 00:25:00

2019-05-29 10:42:06

大數(shù)據(jù)IT人工智能

2018-12-04 15:32:09

數(shù)據(jù)處理大數(shù)據(jù)數(shù)據(jù)分析

2018-11-05 15:15:38

大數(shù)據(jù)流式數(shù)據(jù)互聯(lián)網(wǎng)

2017-09-18 17:59:23

Hadoop數(shù)據(jù)分析
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

亚洲日本一区二区三区| 狠狠综合久久| 欧美日韩国产大片| 蜜臀av.com| 天堂在线观看av| 喷水一区二区三区| 欧美精品在线视频观看| 北岛玲一区二区| 色成人综合网| 欧美日韩免费在线观看| 午夜精品一区二区在线观看| 精品黑人一区二区三区国语馆| 国产精品五区| 精品少妇一区二区30p| 四虎永久免费影院| 日韩成人综合网| 婷婷国产在线综合| 国产精品99久久久久久大便| 无码国精品一区二区免费蜜桃| 久久99精品久久只有精品| 97欧美精品一区二区三区| 久久精品色妇熟妇丰满人妻| 清纯唯美亚洲经典中文字幕| 欧美日韩国产一区二区三区地区| 久久人人爽人人爽人人av| av电影在线网| av动漫一区二区| 国产欧美日韩高清| 免费看一级视频| 亚洲无线视频| 中文字幕日韩视频| 亚洲天堂成人av| 97久久综合精品久久久综合| 欧美美女激情18p| www日韩视频| 中文字幕在线视频网站| 亚洲精品免费在线观看| 欧美日韩精品免费观看| 性xxxx视频播放免费| 国产乱妇无码大片在线观看| 国产欧美一区二区三区久久人妖| 天堂а√在线中文在线新版| 国产一在线精品一区在线观看| 久久精品99久久久久久久久| 99久久99久久精品免费| 欧美精品第一区| 日韩精品视频免费专区在线播放| 在线观看一区二区三区四区| 精品国产一区二| 91.麻豆视频| 一级黄色特级片| 日本在线精品| 欧美三级资源在线| 无码少妇一区二区三区芒果| 欧美成人精品三级网站| 欧美性黄网官网| 欧美v在线观看| 91精品论坛| 一本色道久久综合精品竹菊| 日本成人在线免费视频| 婷婷激情一区| 欧美午夜影院一区| 欧美三级理论片| 国产极品嫩模在线观看91精品| 欧洲精品一区二区| 一路向西2在线观看| 成人国产网站| 欧美疯狂做受xxxx富婆| www,av在线| 精品久久亚洲| 精品久久久久99| 喷水视频在线观看| 伊人久久大香线蕉av不卡| 亚洲石原莉奈一区二区在线观看| 欧美大波大乳巨大乳| 欧美电影一区| 欧美二区在线播放| 日韩乱码人妻无码中文字幕| 亚洲看片免费| 日本电影亚洲天堂| 亚洲无码久久久久久久| 国产精品亚洲第一 | 精品3atv在线视频| 在线观看视频一区二区欧美日韩| 911福利视频| aiai久久| 国产亚洲一区二区精品| 亚洲综合网在线| 最新日韩欧美| 国产精品久久久久久久久久99 | 麻豆极品一区二区三区| 亚洲精品欧美日韩专区| 亚州av在线播放| 中文字幕av一区二区三区| 国产资源第一页| 天堂√8在线中文| 欧美日韩精品系列| 中文字幕一区二区三区乱码不卡| 国产成人精品免费视| 久久精品视频99| 91浏览器在线观看| 精品一区二区三区欧美| 国产精品国产精品国产专区不卡| 国产中文字幕在线视频| 尤物视频一区二区| 亚洲国产精品毛片av不卡在线| 国产一区二区三区视频在线| 日韩福利视频在线观看| 日韩精品一区二区三区在线视频| 在线不卡欧美| 国产男人精品视频| 亚洲av成人精品日韩在线播放| 中文字幕一区日韩精品欧美| 日韩国产欧美亚洲| 99tv成人影院| 一本久久综合亚洲鲁鲁| 豆国产97在线 | 亚洲| 看国产成人h片视频| 久久国产精品免费一区| 超碰电影在线播放| 在线观看一区不卡| 欧美亚一区二区三区| 欧美日韩一视频区二区| 国产精品丝袜高跟| 四虎免费在线观看视频| 国产精品久久久午夜夜伦鲁鲁| 91视频在线观看免费| 好吊色这里只有精品| 欧美成人精品三级网站| 日韩国产欧美精品一区二区三区| 超碰手机在线观看| 日韩av一二三| 亚洲一区二区三区美女| 久久av高潮av| 亚州精品国产| 在线看国产精品| 青青青国产在线| 成人av午夜影院| 真实国产乱子伦对白视频| 亚洲伦理一区二区| 色青青草原桃花久久综合| 黄色一级视频免费看| 99国产精品一区| 少妇人妻大乳在线视频| 亚洲国产aⅴ精品一区二区| 中文字幕一区二区三区电影| 日韩国产成人在线| 久久久久久**毛片大全| 日本三级免费观看| 亚洲精华一区二区三区| 国产91精品青草社区| 午夜影院在线视频| 亚洲摸摸操操av| 免费观看黄网站| 中文精品久久| 91av免费看| 黑人另类精品××××性爽| 日韩欧美在线影院| 九九九久久久久| 成人综合婷婷国产精品久久蜜臀| 国产成人一二三区| 538任你躁精品视频网免费| 欧美精品福利在线| 天天射天天操天天干| 欧美视频免费在线| 亚洲女优在线观看| 蜜臀av性久久久久蜜臀aⅴ流畅 | 波多野吉衣在线视频| 日本不卡免费新一二三区| 精品三区视频| 久久精品久久久久久国产 免费| 国产麻豆一精品一男同| 一区二区三区在线影院| 北京富婆泄欲对白| 视频一区二区三区中文字幕| 一本色道久久综合亚洲二区三区 | 在线视频观看国产| 亚洲国产又黄又爽女人高潮的| 国产福利拍拍拍| 国产农村妇女精品| 亚洲制服在线观看| 99国产精品久久久久久久| 日韩国产欧美一区| 亚洲一区二区三区久久久| 欧美激情区在线播放| 天堂v视频永久在线播放| 欧美日韩激情一区| 黄色小说在线观看视频| 久久久亚洲午夜电影| 亚洲午夜精品一区| 一本色道久久综合亚洲精品不卡| 日韩精品欧美专区| 51vv免费精品视频一区二区| 日本一区二区在线播放| 黄色大片在线播放| 亚洲精品国产精品久久清纯直播| 欧美一级黄视频| 亚洲激情图片小说视频| 一道本在线观看| 高清不卡一区二区在线| 欧美综合在线观看视频| 欧美激情第8页| 日韩黄色影视| 精品久久97| 成人字幕网zmw| a一区二区三区| 久久亚洲国产成人| 国产天堂素人系列在线视频| 日韩精品一区二区三区四区视频| 免费又黄又爽又猛大片午夜| 一区二区三区日韩欧美精品| 亚洲天堂岛国片| av高清不卡在线| 韩国三级hd中文字幕有哪些| 日韩精品成人一区二区三区| 激情成人开心网| 色呦哟—国产精品| 欧美极品一区二区| 伊人精品综合| 91在线看www| 91精品国产66| 日本精品视频网站| 7777kkk亚洲综合欧美网站| 久久伊人免费视频| 69久久夜色| 亚洲欧美在线免费观看| 日韩性xxxx| 日韩精品一区二区三区三区免费 | 少妇淫片在线影院| 欧美精品做受xxx性少妇| 1pondo在线播放免费| 亚洲欧美一区二区精品久久久| 亚洲精品无amm毛片| 欧美丰满嫩嫩电影| 国产精品久久久久毛片| 欧美视频一区二区三区四区| 中文字幕在线欧美| 精品日本美女福利在线观看| 久久久久亚洲天堂| 亚洲免费高清视频在线| fc2ppv在线播放| 国产精品久久久久久久岛一牛影视 | 亚洲亚裔videos黑人hd| 飘雪影院手机免费高清版在线观看| 欧美精品一区视频| 亚洲成a人片77777精品| 日韩一区二区中文字幕| 国产丰满美女做爰| 欧美一区二区视频在线观看| 国产婷婷一区二区三区久久| 9191精品国产综合久久久久久 | 精品在线一区二区三区| 91看片在线免费观看| 日韩黄色免费电影| 91制片厂毛片| 国产在线视频精品一区| 波多野结衣在线免费观看| 国产精品18久久久久久vr| 4438x全国最大成人| 国产成人一级电影| 影音先锋资源av| 91在线视频18| 亚洲精品国产一区黑色丝袜| 中文字幕va一区二区三区| www.xx日本| 一区二区三区成人| 日本一级淫片色费放| 欧美性生交xxxxx久久久| 欧美日韩一级黄色片| 欧美性大战久久久久久久蜜臀| 在线播放成人av| 欧美一区二区三区视频在线| 丰满人妻一区二区三区四区53| 亚洲第一av网| 黄色av网站在线| www.亚洲免费视频| 五月婷婷视频在线观看| 91国产精品电影| 日本成人片在线| 国产裸体写真av一区二区| 蜜桃精品视频| 久久综合精品一区| 日韩精品dvd| 国产精品久久久久久久乖乖| 久久精品一本| 中文字幕日韩久久| 99国内精品久久| 亚洲 欧美 国产 另类| 亚洲一区二区美女| 精品久久久久久久久久久久久久久久久久 | 中文字幕久精品免费视频| 国产视频一区二区| 97av在线视频| 在线观看欧美| 精品欧美一区二区久久久伦| 成人综合一区| 国产免费黄色一级片| 日本欧美韩国一区三区| 香蕉视频免费网站| 日本一区二区高清| 亚洲国产精品成人无久久精品| 在线看不卡av| 亚洲欧美激情在线观看| 国产亚洲激情在线| 欧美性受ⅹ╳╳╳黑人a性爽| 国产成人福利网站| 97se亚洲| 中文字幕一区二区三区精彩视频| 亚洲另类自拍| 亚洲天堂av一区二区三区| 久久精品日产第一区二区三区高清版| 动漫性做爰视频| 欧美自拍偷拍午夜视频| 天堂8在线视频| 日韩网站免费观看| 日韩免费小视频| 久久99导航| 最新日韩在线| 精品人妻无码中文字幕18禁| 国产精品二三区| 91黑人精品一区二区三区| 亚洲黄色www网站| 日韩经典av| 成人久久18免费网站图片| 久久不见久久见国语| 日本在线xxx| 国产白丝网站精品污在线入口| 99精品中文字幕| 欧美亚洲国产bt| 国产精品无码2021在线观看| 91wwwcom在线观看| 哺乳一区二区三区中文视频 | 99xxxx成人网| 欧美一级片在线免费观看| 综合中文字幕亚洲| 亚洲天堂avav| 在线日韩中文字幕| 亚洲伦乱视频| 日韩精品伦理第一区| 三级成人在线视频| 中文字幕 自拍| 91久久精品一区二区二区| 免费在线黄色影片| 欧美洲成人男女午夜视频| 欧洲vs亚洲vs国产| 日韩在线一级片| 91在线视频播放| 久久国产视频一区| 亚洲欧美日韩爽爽影院| jizz内谢中国亚洲jizz| 欧美一级爽aaaaa大片| 天堂资源在线中文精品| 少妇光屁股影院| 欧洲精品视频在线观看| 北条麻妃在线| 国产欧美日韩最新| 亚洲综合专区| 欧美老女人bb| 五月天婷婷综合| 欧美偷拍视频| 国产精品第一区| 欧美a级片视频| 天天干天天曰天天操| 一区二区三区国产豹纹内裤在线| 黄色片一区二区| 2018中文字幕一区二区三区| 伊人春色之综合网| 天天综合网久久| 亚洲美女在线国产| 日本毛片在线观看| 日本一区二区三区在线播放 | 东北少妇不带套对白| 99久久婷婷国产| 销魂美女一区二区| 久久人体大胆视频| 国产乱人伦精品一区| 欧美性大战久久久久xxx| 国产欧美日韩卡一| 99在线精品视频免费观看20| 久久青草福利网站| 成人免费在线观看av| 一级片免费在线观看视频| 日韩激情视频网站| 欧美精品久久久久久久免费观看 | 国产永久免费网站| 亚洲欧美视频在线观看| 亚洲黄色在线播放| 热re91久久精品国99热蜜臀| 欧美hd在线| 91超薄肉色丝袜交足高跟凉鞋| 日韩欧美亚洲综合| 国产调教视频在线观看| 久久综合色一本| 久久97超碰国产精品超碰| 国产精品第56页| 日韩中文字幕免费看| 国产精品欧美大片| 日本在线一二三区| 婷婷亚洲久悠悠色悠在线播放| 色多多视频在线观看|