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!