2012-02-07 20 views
5

Yay yığın programım var.İlkbahar toplu uygulamasında atlama ilkesi uygulamasıyla ilgili garip davranış

atlama sınırı 5'e ayarlanır ve parça boyutu aşağıda iki basamaklı bir iş var 1000

geçerli: atlama politikası aşağıdaki gibidir

<step id="myFileGenerator" next="myReportGenerator"> 
     <tasklet transaction-manager="jobRepository-transactionManager"> 
      <chunk reader="myItemReader" processor="myItemProcessor" writer="myItemWriter" commit-interval="1000" skip-policy="skipPolicy"/> 
     </tasklet> 
     <listeners> 
      <listener ref="mySkipListener"/> 
     </listeners> 
    </step> 

    <step id="myReportGenerator"> 
     <tasklet ref="myReportTasklet" transaction-manager="jobRepository-transactionManager"/> 
    </step> 

:

<beans:bean id="skipPolicy" class="com.myPackage.util.Skip_Policy"> 
    <beans:property name="skipLimit" value="5"/> 
</beans:bean> 

SkipPolicy sınıfı aşağıdaki gibidir:

public class Skip_Policy implements SkipPolicy { 

private int skipLimit; 

public void setSkipLimit(final int skipLimit) { 
    this.skipLimit = skipLimit; 
} 

public boolean shouldSkip(final Throwable t, final int skipCount) throws SkipLimitExceededException { 

    if (skipCount < this.skipLimit) { 
     return true; 
    } 
    return false; 
} 
} 

Böylece, atlama sınırına ulaşılmadan önce meydana gelen herhangi bir hataya ulaşıldığında, atlama ilkesi hatayı yok sayar (dönüş true). Atlama sınırına ulaşıldıktan sonra herhangi bir hata için iş başarısız olur.

mySkipListener sınıfı aşağıdaki gibidir: myItemProcessor Şimdi

public class mySkipListener implements SkipListener<MyItem, MyItem> { 

public void onSkipInProcess(final MyItem item, final Throwable t) { 
    // TODO Auto-generated method stub 
    System.out.println("Skipped details during PROCESS is: " + t.getMessage()); 
} 

public void onSkipInRead(final Throwable t) { 

    System.out.println("Skipped details during READ is: " + t.getMessage()); 
} 

public void onSkipInWrite(final MyItem item, final Throwable t) { 
    // TODO Auto-generated method stub 
    System.out.println("Skipped details during WRITE is: " + t.getMessage()); 
} 
} 

ben kod bloğu aşağıda bulunmaktadır: theNumber alan null öğelerden bazıları için

if (item.getTheNumber().charAt(4) == '-') { 
     item.setProductNumber(item.getTheNumber().substring(0, 3)); 
    } else { 
     item.setProductNumber("55"); 
    } 

ve böylece kodunun üzerindeki bloğu atar " StringIndexOutofBounds "istisna.

Ama neden olduğunu anlayamadığım garip bir davranış görüyorum.

Hepsinde hata olan 6 öğe vardır, yani Sayı alanı boştur.

Atlama sınırı, hata sayısından (ör.> 6) fazlaysa, atlama dinleyicisi sınıfındaki sys çıkışları çağrılır ve atlanan hatalar bildirilir. Atlama sınırı (benim örnekte olduğu gibi 5 diyelim) daha az olması durumunda

Ancak, atlama dinleyici sınıfında sys çıkışları hiç denilen sakın ve doğrudan konsolda aşağıdaki istisna dökümü alıyorum:

org.springframework.batch.retry.RetryException: Non-skippable exception in recoverer while processing; nested exception is java.lang.StringIndexOutOfBoundsException 
at org.springframework.batch.core.step.item.FaultTolerantChunkProcessor$2.recover(FaultTolerantChunkProcessor.java:282) 
at org.springframework.batch.retry.support.RetryTemplate.handleRetryExhausted(RetryTemplate.java:416) 
at org.springframework.batch.retry.support.RetryTemplate.doExecute(RetryTemplate.java:285) 
at org.springframework.batch.retry.support.RetryTemplate.execute(RetryTemplate.java:187) 

Bu davranışın arkasındaki sebep nedir? Bunu çözmek için ne yapmalıyım?

Okumak için teşekkürler!

cevap

2

SkipListener yalnızca Chunk öğesinin sonunda kullanılır, eğer onu içeren görev normal olarak biterse. Atlama sınırından daha fazla hata olduğunda, bu durum, gördüğünüz istisna yoluyla bildirilir ve görevler iptal edilir.

Hata sayısı atlama limitinden daha azsa, görev işareti normal olarak tamamlanır ve her atlanan çizgi veya öğe için SkipListener bir kez çağrılır - Spring Batch, içerdikleri gibi yalnızca dahili olarak bir liste oluşturur. sonunda.

Eğer bu işin başarısız olmasından kaynaklanıyorsa, büyük olasılıkla tekrar denenecek, yani tamamlanmamış bir çalışmada atlanan şeyin ne olduğunu bilerek bu işe yaramazsa, tekrar denediğinizde aynı bildirimi alacaksınız. Sadece her şey başarılı olursa, neyin atlandığını görebiliyor musunuz? Atlanan öğeleri kaydettiğinizi görüntülediğinizde, bunların tekrar tekrar atlandığını görmek için oturum açılmasını istemezsiniz.

Gördüğünüz gibi, basit çözüm atlama limitini yeterince büyük yapmaktır. Yine fikir şudur ki, çok fazla eşya atlamak zorunda kalırsanız, muhtemelen daha ciddi bir problem vardır.