中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

Spring Batch 之 skip講解(jie)(九)

      前面的文章跟(gen)大家一起討論了Spring Batch的概(gai)念,處(chu)(chu)理(li)流(liu)程,以及SpringBatch處(chu)(chu)理(li)文件、DB的一些(xie)簡單實例。接下來的討論,主要(yao)是關于(yu)Spring Batch的一些(xie)高級應用處(chu)(chu)理(li)和實際開發(fa)中(zhong)需要(yao)注(zhu)意的一些(xie)問題。

      今天主要(yao)和大家討論SpringBatch關于skip容錯機制的一些(xie)處理。

      一、skip的介紹

      在實際的(de)(de)(de)項目(mu)開發(fa)中,我們(men)常常要將(jiang)幾十萬甚至上(shang)百(bai)萬的(de)(de)(de)數(shu)據(ju)(ju)從文(wen)件導(dao)入(ru)到DB中,如(ru)(ru)(ru)果(guo)其中某(mou)條數(shu)據(ju)(ju)導(dao)入(ru)時發(fa)生例外(wai),我們(men)并不想整個Job以(yi)失敗而(er)結束,而(er)是希望能(neng)將(jiang)錯誤的(de)(de)(de)數(shu)據(ju)(ju)經過處理(li)(li)后(hou)保存(cun)起來,其余正(zheng)確的(de)(de)(de)數(shu)據(ju)(ju)繼續做導(dao)入(ru)處理(li)(li)。如(ru)(ru)(ru)果(guo)遇(yu)到這(zhe)樣的(de)(de)(de)場(chang)景(jing),SpringBatch的(de)(de)(de)skip機(ji)制就可以(yi)派上(shang)用場(chang)了。顧名思義,skip的(de)(de)(de)作用就是跳過某(mou)些數(shu)據(ju)(ju)(例如(ru)(ru)(ru)錯誤數(shu)據(ju)(ju))。 

      二、配置skip信息

      配置skip的(de)示例代碼(ma)如下:

 1 <job id="csvJob">
2 <step id="csvStep">
3 <tasklet transaction-manager="transactionManager">
4 <chunk reader="itemReaders" writer="itemWriter" processor="itemProcessor"
5 commit-interval="1" skip-limit="1000">
6 <skippable-exception-classes>
7 <include class="org.springframework.batch.item.file.FlatFileParseException" />
8 </skippable-exception-classes>
9 </chunk>
10 </tasklet>
11 </step>
12 </job>

      代碼第5行(xing)chunk的(de)skip-limit屬性(xing)是(shi)指(zhi)(zhi)允許跳過(guo)記錄(lu)的(de)行(xing)數,6-8行(xing)是(shi)指(zhi)(zhi)允許發(fa)生的(de)例外,也(ye)就是(shi)說(shuo)在(zai)發(fa)生FlatFileParseException(及(ji)其子類(lei))的(de)時候,job是(shi)不會被終(zhong)止的(de),而是(shi)跳過(guo)當前的(de)記錄(lu),去執行(xing)下面那(nei)條記錄(lu)。 上(shang)面的(de)代碼也(ye)會有另(ling)外一個問題(ti),就是(shi)發(fa)生FlatFileParseException以外例外的(de)時候,Job也(ye)會失敗。這也(ye)滿足不了我們上(shang)面說(shuo)的(de)那(nei)種(zhong)場景(jing),當然,6-8行(xing)還有另(ling)外一種(zhong)配置方式(shi),如下:

1 <skippable-exception-classes>
2   <include class="java.lang.Exception"/>
3 <exclude class="java.io.FileNotFoundException"/>
4 </skippable-exception-classes>

      include是允許跳過(guo)的(de)錯(cuo),exclude是不允許跳過(guo)的(de)錯(cuo)。如果像上訴代(dai)碼那(nei)樣配置(zhi)的(de)話,所(suo)有Exception及其子(zi)類(FileNotFoundException除外)發(fa)生時(shi),Job都不會(hui)被終止(zhi);但是當FileNotFoundException發(fa)生時(shi),雖(sui)然它也是Exception的(de)子(zi)類,但Job會(hui)被終止(zhi),因為FileNotFoundException屬(shu)于(yu)exclude屬(shu)性的(de)class。

      三、skip深入講解

      是(shi)誰在決定當前的(de)(de)記錄跳(tiao)過(guo)與否呢?其實,當Reader、Processor和Writer拋(pao)出例外的(de)(de)時(shi)候,SpringBatch會調(diao)用skip機制,來判斷(duan)當前例外發(fa)生時(shi),正在被(bei)(bei)處理的(de)(de)記錄是(shi)否被(bei)(bei)跳(tiao)過(guo)。當在上面的(de)(de)代碼中配(pei)置skippable-exception-classes屬性的(de)(de)時(shi)候,SpringBatch會默認的(de)(de)調(diao)用LimitCheckingItemSkipPolicy類。如(ru)果(guo)簡單的(de)(de)配(pei)置skip-limit和skippable-exception-classes不能滿足需求時(shi),也可以定義自己的(de)(de)skip策略(lve)。代碼如(ru)下:

 1 package com.wanggc.springbatch.sample;
2
3 import org.springframework.batch.core.step.skip.SkipLimitExceededException;
4 import org.springframework.batch.core.step.skip.SkipPolicy;
5
6 /**
7 * 自定義Skip策略類。
8 * @author Wanggc
9 */
10 public class MySkipPolicy implements SkipPolicy {
11
12 @Override
13 public boolean shouldSkip(Throwable t, int skipCount)
14 throws SkipLimitExceededException {
15 // TODO Auto-generated method stub
16 return false;
17 }
18 }

      如(ru)示例代(dai)碼所(suo)示,要(yao)實現(xian)SkipPolicy接口,在shouldSkip方法(fa)中定義自(zi)己(ji)的(de)(de)skip策略。返回false時,說明(ming)當(dang)前例外不能被(bei)跳過(guo),否則可(ke)以(yi)被(bei)跳過(guo)。當(dang)然,定義了自(zi)己(ji)的(de)(de)skip策略還不夠(gou),還要(yao)告訴(su)框架(jia)要(yao)使用自(zi)己(ji)定義的(de)(de)skip策略,而不是框架(jia)默認的(de)(de)。這就需要(yao)添加chunk的(de)(de)另外一個屬性skip-policy。代(dai)碼如(ru)下(xia):

 1 <job id="csvJob">
2 <step id="csvStep">
3 <tasklet transaction-manager="transactionManager">
4 <chunk reader="itemReaders" writer="itemWriter" processor="itemProcessor"
5 commit-interval="1" skip-limit="1000" skip-policy="mySkipPolicy">
6 <skippable-exception-classes>
7 <include
8 class="org.springframework.batch.item.file.FlatFileParseException" />
9 </skippable-exception-classes>
10 </chunk>
11 </tasklet>
12 </step>
13 </job>
14 <bean:bean id="mySkipPolicy" class="com.wanggc.springbatch.sample.MySkipPolicy"/>

      添加了skip-policy屬性后,skip-limit和skippable-exception-classes默認策略將不再起作用。當然,可(ke)以將其刪除,示例中屬于垃圾代碼。

      當(dang)(dang)Reader、Processor和Writer拋出例(li)(li)外的(de)時候,SpringBatch處理(li)skip策略的(de)方式是(shi)不同的(de)。當(dang)(dang)Reader發生(sheng)可以被(bei)skip的(de)例(li)(li)外時,SpringBatch會接著去(qu)讀下面(mian)一條(tiao)(tiao)記錄(lu)(lu),并不會回(hui)滾(gun)事務(wu)。當(dang)(dang)Processor發生(sheng)可以被(bei)skip的(de)例(li)(li)外時,SpringBatch會回(hui)滾(gun)當(dang)(dang)前chunk的(de)事務(wu),并將(jiang)除了引發例(li)(li)外以外的(de)數(shu)據傳(chuan)給(gei)Writer。當(dang)(dang)Writer發生(sheng)可以被(bei)skip的(de)例(li)(li)外的(de)時,SpringBatch首先回(hui)滾(gun)事務(wu),因為(wei)傳(chuan)給(gei)Writer的(de)是(shi)一個list,所以Writer不知道是(shi)list中那條(tiao)(tiao)記錄(lu)(lu)造成了例(li)(li)外的(de)發生(sheng)。Writer會將(jiang)list拆開,一條(tiao)(tiao)條(tiao)(tiao)的(de)處理(li),正確(que)的(de)數(shu)據提交,錯(cuo)誤的(de)數(shu)據回(hui)滾(gun)。

      對SpringBatch的skip機(ji)制的討論就到這里了(le),接下來會討論其他一(yi)些高級屬性。

 

posted @ 2012-01-02 01:07  孤旅者  閱讀(17505)  評論(2)    收藏  舉報