一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - 詳解SpringBoot和SpringBatch 使用

詳解SpringBoot和SpringBatch 使用

2021-05-21 11:00技術(shù)小能手 Java教程

Spring Batch 是一個(gè)輕量級(jí)的、完善的批處理框架,旨在幫助企業(yè)建立健壯、高效的批處理應(yīng)用。這篇文章主要介紹了詳解SpringBoot和SpringBatch 使用,需要的朋友可以參考下

什么是spring batch

spring batch 是一個(gè)輕量級(jí)的、完善的批處理框架,旨在幫助企業(yè)建立健壯、高效的批處理應(yīng)用。spring batch是spring的一個(gè)子項(xiàng)目,使用java語言并基于spring框架為基礎(chǔ)開發(fā),使的已經(jīng)使用 spring 框架的開發(fā)者或者企業(yè)更容易訪問和利用企業(yè)服務(wù)。

spring batch 提供了大量可重用的組件,包括了日志、追蹤、事務(wù)、任務(wù)作業(yè)統(tǒng)計(jì)、任務(wù)重啟、跳過、重復(fù)、資源管理。對(duì)于大數(shù)據(jù)量和高性能的批處理任務(wù),spring batch 同樣提供了高級(jí)功能和特性來支持,比如分區(qū)功能、遠(yuǎn)程功能??傊?通過 spring batch 能夠支持簡(jiǎn)單的、復(fù)雜的和大數(shù)據(jù)量的批處理作業(yè)。

spring batch 使用

我們首先配置spring batch 在spring boot 中的使用,數(shù)據(jù)庫(kù)用的是mysql,pom文件如下,因?yàn)閟pring boot 中的spring batch 包含 hsqsldb 所以我們將其去除

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-batch</artifactid>
      <exclusions> <!-- 注意這里-->
        <exclusion>
          <groupid>org.hsqldb</groupid>
          <artifactid>hsqldb</artifactid>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-jdbc</artifactid>
    </dependency>
    <dependency>
      <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
<dependency>
    <groupid>org.hibernate</groupid>
    <artifactid>hibernate-validator</artifactid>
  </dependency>
  <dependency>
    <groupid>mysql</groupid>
    <artifactid>mysql-connector-java</artifactid>
    <version>5.1.21</version>
  </dependency>
  <dependency>
    <groupid>org.springframework.boot</groupid>
    <artifactid>spring-boot-starter-test</artifactid>
    <scope>test</scope>
  </dependency>

配置好我們需要的實(shí)體類。頁面就不展示了。

如果有數(shù)據(jù)校驗(yàn)添加的話那么我們需要配置自定義的檢驗(yàn)器。若果沒有課略過該步驟

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class csvbeanvalidator<t> implements validator<t>,initializingbean {
  private javax.validation.validator  validator;
  @override
  public void validate(t value) throws validationexception {
    set<constraintviolation<t >> constraintviolations=validator.validate(value);
    if(constraintviolations.size()>0){
      stringbuilder message=new stringbuilder();
      for(constraintviolation<t> constraintviolation:constraintviolations){
        message.append(constraintviolation.getmessage() +"\n");
      }
      throw new validationexception(message.tostring());
    }
  }
  //在這里我們使用的是jsr-303校驗(yàn)數(shù)據(jù),在此進(jìn)行初始化
  @override
  public void afterpropertiesset() throws exception {
    validatorfactory validatorfactory= validation.builddefaultvalidatorfactory();
    validator=validatorfactory.usingcontext().getvalidator();
  }
}
public class csvitemprocessor extends validatingitemprocessor<person> {
  @override
  public person process(person item) throws validationexception {
     super.process(item); // 在這里啟動(dòng) 然后才會(huì)調(diào)用我們自定義的校驗(yàn)器,否則不能通過 。
     if (item.getnation().equals("漢族")){
       item.setname("01");
     }else{
       item.setnation("02");
     }
     return item;
  }
}

進(jìn)行job任務(wù)監(jiān)聽 自定義類實(shí)現(xiàn)jobexecutionlistener 即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
long starttime;
 long endtime;
 @override
 public void beforejob(jobexecution jobexecution) {
   starttime = system.currenttimemillis();
   system.out.println("任務(wù)處理開始");
 }
 @override
 public void afterjob(jobexecution jobexecution) {
   endtime = system.currenttimemillis();
   system.out.println("耗時(shí)多長(zhǎng)時(shí)間:" + (endtime - starttime) + "ms");
   system.out.println("任務(wù)處理結(jié)束");
 }

進(jìn)行spring batch 的注入 方法有xml文件注入bean ,在這里選擇java注入

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
@configuration
@enablebatchprocessing //開啟批處理
public class csvbatchconfig {
  /**1 首先我們通過 flatfileitemreader 讀取我們需要的文件 通過setresource來實(shí)現(xiàn)
   * 2 設(shè)置map 在這里通過先設(shè)置解析器 setlinetokenizer 來解析我們csv文件中的數(shù)   據(jù)
   * 3 setfieldsetmapper 將我們需要的數(shù)據(jù)轉(zhuǎn)化為我們的實(shí)體對(duì)象 存儲(chǔ)
   * 4 如果想 跳過前面的幾行 需要使用setlinestoskip就可以實(shí)現(xiàn)
   */
 @bean
 public itemreader<person> reader() throws exception {
   flatfileitemreader<person> reader = new flatfileitemreader<person>(); //1
   reader.setresource(new classpathresource("people.csv")); //2
     reader.setlinemapper(new defaultlinemapper<person>() {{ //3
       setlinetokenizer(new delimitedlinetokenizer() {{
         setnames(new string[] { "name","age", "nation" ,"address"});
       }});
       setfieldsetmapper(new beanwrapperfieldsetmapper<person>() {{
         settargettype(person.class);
       }});
     }});
       reader.setlinestoskip(3);
     return reader;
 }
 @bean
 public itemprocessor<person, person> processor() {
   csvitemprocessor processor = new csvitemprocessor(); //1
   processor.setvalidator(csvbeanvalidator()); //2
   return processor;
 }
   /**
    *寫入數(shù)據(jù)到數(shù)據(jù)庫(kù)中
    * 1執(zhí)行的sql 語句 2 設(shè)置數(shù)據(jù)源
     */
 @bean
 public itemwriter<person> writer(datasource datasource) {//1
   jdbcbatchitemwriter<person> writer = new jdbcbatchitemwriter<person>(); //2
   writer.setitemsqlparametersourceprovider(new beanpropertyitemsqlparametersourceprovider<person>());
   string sql = "insert into person " + "(id,name,age,nation,address) "
       + "values(hibernate_sequence.nextval, :name, :age, :nation,:address)";
   writer.setsql(sql); //3
   writer.setdatasource(datasource);
   return writer;
 }
  // 作業(yè)的倉(cāng)庫(kù) 就是設(shè)置數(shù)據(jù)源
 @bean
 public jobrepository jobrepository(datasource datasource, platformtransactionmanager transactionmanager)
     throws exception {
   jobrepositoryfactorybean jobrepositoryfactorybean = new jobrepositoryfactorybean();
   jobrepositoryfactorybean.setdatasource(datasource);
   jobrepositoryfactorybean.settransactionmanager(transactionmanager);
   jobrepositoryfactorybean.setdatabasetype("mysql");
   return jobrepositoryfactorybean.getobject();
 }
   //調(diào)度器 使用它來執(zhí)行 我們的批處理
 @bean
 public simplejoblauncher joblauncher(datasource datasource, platformtransactionmanager transactionmanager)
     throws exception {
   simplejoblauncher joblauncher = new simplejoblauncher();
   joblauncher.setjobrepository(jobrepository(datasource, transactionmanager));
   return joblauncher;
 }
   //將監(jiān)聽器加入到j(luò)ob中
 @bean
 public job importjob(jobbuilderfactory jobs, step s1) {
   return jobs.get("importjob")
       .incrementer(new runidincrementer())
       .flow(s1) //1
       .end()
       .listener(csvjoblistener()) //2
       .build();
 }
   //步驟綁定 reader 與writer 一次性處理65000條記錄
 @bean
 public step step1(stepbuilderfactory stepbuilderfactory, itemreader<person> reader, itemwriter<person> writer,
     itemprocessor<person,person> processor) {
   return stepbuilderfactory
       .get("step1")
       .<person, person>chunk(65000) //1
       .reader(reader) //2
       .processor(processor) //3
       .writer(writer) //4
       .build();
 }
 @bean
 public csvjoblistener csvjoblistener() {
   return new csvjoblistener();
 }
 @bean
 public validator<person> csvbeanvalidator() {
   return new csvbeanvalidator<person>();
 }
}

在配置文件中 啟動(dòng)自動(dòng)執(zhí)行批處理

spring.batch.job.names = job1,job2 #啟動(dòng)時(shí)要執(zhí)行的job,默認(rèn)執(zhí)行全部job

spring.batch.job.enabled=true #是否自動(dòng)執(zhí)行定義的job,默認(rèn)是

spring.batch.initializer.enabled=true #是否初始化spring batch的數(shù)據(jù)庫(kù),默認(rèn)為是

spring.batch.schema=

spring.batch.table-prefix= #設(shè)置springbatch的數(shù)據(jù)庫(kù)表的前綴

項(xiàng)目匯總

從 項(xiàng)目中我們可以看到 總的步驟就是 首先讀取我們需要實(shí)現(xiàn)的文件進(jìn)行解析,然后轉(zhuǎn)換成需要的實(shí)體類并且綁定到reader中,二 實(shí)現(xiàn)我們需要的writer 并且?guī)偷降綌?shù)據(jù)庫(kù)上,三實(shí)現(xiàn)job監(jiān)聽器將其綁定到步驟中 。最后開啟批處理 自動(dòng)執(zhí)行入庫(kù)即可 。這個(gè)簡(jiǎn)單步驟主要是配置中用到的 理解流程 自己也可以方便實(shí)現(xiàn) 批處理的流程。

總結(jié)

以上所述是小編給大家介紹的springboot和springbatch 使用,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!

原文鏈接:https://yq.aliyun.com/articles/619189

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 网红思瑞一区二区三区 | 国产精品中文 | 国产99页| 女人日男人| 亚洲日日操 | 免费特黄一级欧美大片 | 毛片在线播放a | 青柠影视在线播放观看高清 | 免费91麻豆精品国产自产在线观看 | 成人在线小视频 | 亚洲色图2 | 香蕉在线精品亚洲第一区 | 亚洲乱码一二三四区国产 | 国产精品啪啪 | 深夜福利在线播放 | 国产98在线 | 亚洲精品丝袜在线一区波多野结衣 | 特a级片| 精品第一国产综合精品蜜芽 | 被强迫变性翘秘书 | 我年轻漂亮的继坶2中字在线播放 | 日日爽日日操 | 精品一区二区免费视频蜜桃网 | 亚洲AV永久无码精品老司机蜜桃 | 男人的天堂视频 | 秋霞在线观看成人高清视频51 | 国产精品自在欧美一区 | 午夜国产小视频 | 国产一卡2卡3卡四卡精品网站 | 韩国三级日本三级香港三级黄 | bt天堂在线观看国产 | 高h全肉np触手 | 欧美性xxxxxx爱 | 日韩三及片| 好男人影视社区www在线观看 | 午夜福利在线观看6080 | 黑人疯狂巨大xxoo | 久久这里只有精品无码3D | 国产成人愉拍精品 | 精品久久免费视频 | 2012手机在线中文字幕 |