国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

基于SpringBoot使用Spring Batch批處理框架,處理大數據新方案

開發 前端
Spring Batch可以提供大量的,可重復的數據處理功能,包括日志記錄/跟蹤,事務管理,作業處理統計工作重新啟動、跳過,和資源管理等重要功能。

環境:Springboot2.4.12 + Spring Batch4.2.7

Spring Batch是一個輕量級的,完全面向Spring的批處理框架,可以應用于企業級大量的數據處理系統。Spring Batch以POJO和大家熟知的Spring框架為基礎,使開發者更容易的訪問和利用企業級服務。Spring Batch可以提供大量的,可重復的數據處理功能,包括日志記錄/跟蹤,事務管理,作業處理統計工作重新啟動、跳過,和資源管理等重要功能。

業務場景:

  1. 定期提交批處理。
  2. 并行批處理:作業的并行處理
  3. 分階段、企業消息驅動的處理
  4. 大規模并行批處理
  5. 故障后手動或計劃重新啟動
  6. 相關步驟的順序處理(擴展到工作流驅動的批處理)
  7. 部分處理:跳過記錄(例如,回滾時)
  8. 整批事務,適用于小批量或現有存儲過程/腳本的情況

技術目標:

  • 批處理開發人員使用Spring編程模型:專注于業務邏輯,讓框架負責基礎設施。
  • 基礎架構、批處理執行環境和批處理應用程序之間的關注點清晰分離。
  • 提供通用的核心執行服務,作為所有項目都可以實現的接口。
  • 提供可“開箱即用”的核心執行接口的簡單和默認實現。
  • 通過在所有層中利用spring框架,可以輕松配置、定制和擴展服務。
  • 所有現有的核心服務都應該易于替換或擴展,而不會對基礎架構層造成任何影響。
  • 提供一個簡單的部署模型,使用Maven構建的架構JAR與應用程序完全分離。

Spring Batch的結構:

圖片圖片

此分層體系結構突出了三個主要的高級組件:應用程序、核心和基礎架構。該應用程序包含開發人員使用SpringBatch編寫的所有批處理作業和自定義代碼。批處理核心包含啟動和控制批處理作業所需的核心運行時類。它包括JobLauncher、Job和Step的實現。應用程序和核心都構建在公共基礎架構之上。此基礎結構包含公共讀寫器和服務(如RetryTemplate),應用程序開發人員(讀寫器,如ItemReader和ItemWriter)和核心框架本身(retry,它是自己的庫)都使用這些服務。

下面介紹開發流程

本例完成 讀取文件內容,經過處理后,將數據保存到數據庫中

引入依賴

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.hibernate</groupId>
  <artifactId>hibernate-validator</artifactId>
  <version>6.0.7.Final</version>
</dependency>

應用配置文件

spring:
  datasource:
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/batch?serverTimeznotallow=GMT%2B8
    username: root
    password: *******
    type: com.zaxxer.hikari.HikariDataSource
    hikari:
      minimumIdle: 10
      maximumPoolSize: 200
      autoCommit: true
      idleTimeout: 30000
      poolName: MasterDatabookHikariCP
      maxLifetime: 1800000
      connectionTimeout: 30000
      connectionTestQuery: SELECT 1
---
spring:
  jpa:
    generateDdl: false
    hibernate:
      ddlAuto: update
    openInView: true
    show-sql: true
---
spring:
  batch:
    job:
      enabled: false #是否自動執行任務
    initialize-schema: always  #自動為我們創建數據庫腳本

開啟批處理功能

@Configuration
@EnableBatchProcessing
public class BatchConfig extends DefaultBatchConfigurer{
}

任務啟動器

接著上一步的配置類BatchConfig重寫對應方法

@Override
protected JobLauncher createJobLauncher() throws Exception {
  SimpleJobLauncher jobLauncher = new SimpleJobLauncher();
  jobLauncher.setJobRepository(createJobRepository());
  jobLauncher.afterPropertiesSet();
  return jobLauncher;
}

任務存儲

接著上一步的配置類BatchConfig重寫對應方法

@Resource
private PlatformTransactionManager transactionManager ;
@Override
protected JobRepository createJobRepository() throws Exception {
  JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
  factory.setDatabaseType("mysql");
  factory.setTransactionManager(transactionManager);
  factory.setDataSource(dataSource);
  factory.afterPropertiesSet();
  return factory.getObject();
}

定義JOB

@Bean
public Job myJob(JobBuilderFactory builder, @Qualifier("myStep")Step step){
  return builder.get("myJob")
      .incrementer(new RunIdIncrementer())
      .flow(step)
      .end()
      .listener(jobExecutionListener)
      .build();
}

定義ItemReader讀取器

@Bean
public ItemReader<Person> reader(){
  FlatFileItemReader<Person> reader = new FlatFileItemReader<>();
  reader.setResource(new ClassPathResource("cvs/persons.cvs"));
  reader.setLineMapper(new DefaultLineMapper<Person>() {
    // 代碼塊
    {
      setLineTokenizer(new DelimitedLineTokenizer(",") {
        {
          setNames("id", "name");
        }
      }) ;
      setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
        {
          setTargetType(Person.class) ;
        }
      });
    }
  });
  return reader;
}

定義ItemProcessor處理器

@Bean
public ItemProcessor<Person, Person2> processorPerson(){
  return new ItemProcessor<Person, Person2>() {
      @Override
      public Person2 process(Person item) throws Exception {
        Person2 p = new Person2() ;
        p.setId(item.getId()) ;
        p.setName(item.getName() + ", pk");
        return p ;
      }
  } ;
}

定義ItemWriter寫數據

@Resource
private Validator<Person> validator ;
@Resource
private EntityManagerFactory entityManagerFactory ;
@Bean
public ItemWriter<Person2> writerPerson(){
  JpaItemWriter<Person2> writer = null ;
  JpaItemWriterBuilder<Person2> builder = new JpaItemWriterBuilder<>() ;
  builder.entityManagerFactory(entityManagerFactory) ;
  writer = builder.build() ;
  return writer;
}

定義Step

@Bean
public Step myStep(StepBuilderFactory stepBuilderFactory, ItemReader<Person> reader, ItemWriter<Person> writer, ItemProcessor<Person, Person> processor){
  return stepBuilderFactory
          .get("myStep")
          .<Person, Person>chunk(2) // Chunk的機制(即每次讀取一條數據,再處理一條數據,累積到一定數量后再一次性交給writer進行寫入操作)
          .reader(reader).faultTolerant().retryLimit(3).retry(Exception.class).skip(Exception.class).skipLimit(2)
          .listener(new MyReadListener())
          .processor(processor)
          .writer(writer).faultTolerant().skip(Exception.class).skipLimit(2)
          .listener(new MyWriteListener())
          .build();
}

定義相應的監聽器

public class MyReadListener implements ItemReadListener<Person> {


  private Logger logger = LoggerFactory.getLogger(MyReadListener.class);


  @Override
  public void beforeRead() {
  }


  @Override
  public void afterRead(Person item) {
    System.out.println("reader after: " + Thread.currentThread().getName()) ;
  }


  @Override
  public void onReadError(Exception ex) {
    logger.info("讀取數據錯誤:{}", ex);
  }
}
@Component
public class MyWriteListener implements ItemWriteListener<Person> {
  
    private Logger logger = LoggerFactory.getLogger(MyWriteListener.class);
 
    @Override
    public void beforeWrite(List<? extends Person> items) {
    }
    
    @Override
    public void afterWrite(List<? extends Person> items) {
      System.out.println("writer after: " + Thread.currentThread().getName()) ;
    }
    
    @Override
    public void onWriteError(Exception exception, List<? extends Person> items) {
        try {
            logger.info(format("%s%n", exception.getMessage()));
            for (Person item : items) {
                logger.info(format("Failed writing BlogInfo : %s", item.toString()));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

person.cvs文件內容

圖片圖片

實體類:

@Entity
@Table(name = "t_person")
public class Person {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private Integer id ;
  private String name ;
}

啟動任務執行

@RestController
@RequestMapping("/demo")
public class DemoController {
  @Resource
  @Qualifier("myJob")
  private Job job ;
  @Resource
  private JobLauncher launcher ;
  @GetMapping("/index")
  public Object index() {
    JobParameters jobParameters = new JobParametersBuilder().toJobParameters() ;
    try {
      launcher.run(job, jobParameters) ;
    } catch (JobExecutionAlreadyRunningException | JobRestartException | JobInstanceAlreadyCompleteException
        | JobParametersInvalidException e) {
      e.printStackTrace();
    }
    return "success" ;
  }
}

啟動服務,自動為我們創建了表

圖片圖片

執行任務

查看表情況

圖片圖片


圖片圖片


圖片圖片

責任編輯:武曉燕 來源: Spring全家桶實戰案例源碼
相關推薦

2022-08-02 20:47:38

Spring框架應用程序

2017-01-12 14:50:15

大數據Spring Batc框架

2020-12-11 11:26:47

Spring批處理重試

2025-04-29 08:05:00

JavaScript錯誤處理開發

2024-05-06 08:41:05

Spring應用大數據

2020-11-03 15:10:55

Spring Batc框架Java

2024-12-27 14:45:59

2025-07-29 02:00:00

2025-08-04 09:33:42

2009-07-22 16:43:22

iBATIS框架iBATIS優化

2012-02-20 09:49:42

ibmdw

2009-07-24 16:42:46

iBatis框架做ba

2016-11-15 09:44:21

大數據批處理流處理

2019-04-15 14:06:12

2022-08-16 08:05:21

數據倉庫Flink智慧芽

2011-03-08 13:30:46

Xperf監控Windows性能

2013-05-15 12:20:30

NETGEAR智能家庭

2024-12-02 09:57:43

GormScopesClauses

2024-05-20 08:08:00

分布式系統緩存C#
點贊
收藏

51CTO技術棧公眾號

婷婷激情一区| 亚洲国产va精品久久久不卡综合 | 国产精品一区免费在线观看| 麻豆传媒视频在线| 欧美性潮喷xxxxx免费视频看| 国产av无码专区亚洲精品| 日韩欧美在线播放| 欧美一区二区免费| 国产欧美一区二区精品忘忧草| 日韩一区二区中文| 国产美女精品人人做人人爽| 欧美激情国产日韩| 日韩在线高清视频| 亚洲一区二区美女| 国产在线日韩欧美| 亚洲一区在线电影| 99色精品视频| 国产精品sss| 尤物99国产成人精品视频| 亚洲美女屁股眼交3| 成人在线观看网站| 在线视频日韩一区 | 一个人看的www视频在线免费观看| 欧美丝袜丝交足nylons图片| 亚洲妇熟xx妇色黄| 影视一区二区三区| 国产免费成人在线| 91po在线观看91精品国产性色| 在线亚洲免费视频| 欧美精品一卡| 最近在线中文字幕| 欧美a级免费视频| 成人精品aaaa网站| 日韩情涩欧美日韩视频| 亚洲欧洲三级电影| 日本欧美一区二区在线观看| 电影一区电影二区| 一二三在线视频社区| 成人精品视频在线播放| 97欧美精品一区二区三区| 91久久一区二区| 国模少妇一区二区三区| 国产精品aaa| 亚洲色图五月天| 国产精品午夜在线| 国产日韩欧美在线播放| 国产精品欧美久久久久无广告 | 亚洲成人福利| 成年网站在线播放| 欧美成人a∨高清免费观看| 国产又粗又长又爽视频| 免费在线观看一区二区| 日韩h在线观看| 日韩在线观看av| 色欧美片视频在线观看| 国产成人成网站在线播放青青| 欧美第一黄色网| 中文字幕日韩一区| 国产成人在线视频免费观看| 国产精品99久久久久| 黄页视频在线观看| 狠狠操精品视频| 日韩免费视频播放| av不卡在线免费观看| aaa国产一区| 欧美熟乱15p| www.国产精品一区| 国产精品美女久久久久| wwwav在线| 国内精品卡一卡二卡三新区| 男女曰b免费视频| 久久久久免费看黄a片app| 日韩精品一区二区三区外面| 正在播放日韩精品| 久久亚洲精品小早川怜子| 色婷婷综合久久久久中文| 97色成人综合网站| 色哟哟免费在线观看| 国产wwwxx| 亚洲不卡一卡2卡三卡4卡5卡精品| 欧美在线视频导航| 亚洲日本中文字幕免费在线不卡| 久久精品人人做人人爽电影| 日韩欧美三级一区二区| 黄色一级在线视频| 91网在线播放| 97久久人人超碰caoprom欧美| 二区三区不卡| 丝袜美腿一区二区三区| 超碰在线97免费| 日本一区二区三区在线观看视频| 日韩一本精品| 99久久婷婷| 国产高清一区日本| 国产精品五区| 四虎影院一区二区三区| 国产日韩欧美在线视频观看| 久久久成人精品视频| 欧美成人精品高清在线播放 | 精品久久久久久久久久久久久| 成人动漫在线一区| 日本aⅴ免费视频一区二区三区 | 欧美视频在线免费播放| 日韩欧美一区二区三区四区| 91手机在线视频| 国产精品视频xxxx| 97视频国产在线| 欧美成人亚洲成人| 中文字幕国产亚洲| 亚洲精品自在久久| 日韩一二三区不卡| 欧美午夜精品一区二区三区| 亚洲图片有声小说| 亚洲欧美一区二区不卡| 男男gaygays亚洲| 99综合电影在线视频| 亚洲欧美三级在线| 99精品国产视频| 国产一区二区三区蝌蚪| 日韩电影免费在线观看网站| 国产精品一区二区性色av | 不卡一卡2卡3卡4卡精品在| 成人eeuss影院在线观看| 成年人国产精品| 福利在线一区| 欧美精品自拍| 色哟哟入口国产精品| 亚洲黄色录像片| 中文字幕一区二区三区电影| 青少年xxxxx性开放hg| 91超碰rencao97精品| 亚洲区综合中文字幕日日| 国产精品乱码一区二三区小蝌蚪| 精品久久久久久久中文字幕| 国产精品免费在线| 国产精品一国产精品| 亚洲午夜女主播在线直播| 在线播放国产区| 日韩理论电影| 黄网站色欧美视频| 7777精品伊久久久大香线蕉语言| 欧美成人片在线| 欧美日韩一区 二区 三区 久久精品| 亚洲xxxxxx| 日本国产一区二区| 久久久久久久片| 亚洲性图久久| 久久久久久国产精品| 成人免费网站在线观看视频| 久久久久久穴| 高清欧美性猛交xxxx黑人猛交| 日本24小时在线高清视频| 国产精品综合色区在线观看| 91福利入口| 久久婷婷五月综合色丁香| 欧美日韩在线三区| 亚洲黄色av网址| 国产一区二区伦理| 日韩av电影在线播放| 天然素人一区二区视频| 亚洲第一激情av| 日韩小视频网站| 国产在线播放一区| 国产精品视频一区二区三区经| 成人中文视频| 91麻豆精品国产91久久久久久| 国产女王在线**视频| 久久网站免费观看| 欧美日本韩国一区二区三区视频 | 国产乱淫av片杨贵妃| 日韩欧美专区| 亚洲国产成人91精品| av免费在线视| 红桃视频成人在线观看| 经典三级在线| 亚洲第一级黄色片| 日本啊v在线| 亚洲精品国产a| 亚洲欧美自偷自拍另类| 丁香激情综合五月| 日韩av电影免费播放| 亚洲电影在线一区二区三区| 91精品国产精品| 69174成人网| sis001亚洲原创区| 日韩欧美的一区| bl在线肉h视频大尺度| 欧美猛交ⅹxxx乱大交视频| 欧美日韩精选| 超碰在线观看97| 亚洲欧美视频| 一区二区冒白浆视频| 国产欧美视频一区二区| 福利片在线免费观看| www.69av| 欧美激情久久久久久| 成人日韩在线| 欧美成人午夜激情视频| 亚洲二区三区不卡| 六月激情综合网|