Spring Batch Processor Exception Listener?

时间:2018-01-04 15:22:44

标签: spring spring-batch

我有一个分区的Spring Batch作业,它读取几个拆分的CSV文件并在每个线程中处理每个文件,然后将结果写入相应的输出文件。

如果某个项目无法处理(抛出异常),我想将该结果写入错误文件。有没有办法添加一个可以处理这个的编写器或监听器?

更进一步,有没有办法通过异常类型将其拆分并将不同的异常写入不同的文件?

2 个答案:

答案 0 :(得分:2)

您可以通过指定this.stepBuilders.get("importStep").<X, Y>chunk(10) .reader(this.getItemReader()).faultTolerant().skipPolicy(....) .processor(this.getItemProcessor()) .writer(this.getItemWriter()) .build(); 来实现此目的。实现此接口并添加您自己的逻辑。

var d = new Date();   

var month = d.getMonth() + 1;
var year = d.getFullYear();
var day = d.getUTCDate();

var highestDate = new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();

var fromDateString = year + "-" + month + "-01";
var toDateString = year + "-" + month + "-" + day;

console.log(fromDateString + " - " + toDateString)

您可以在批次中指定此跳过政策。

getUTCDate()

答案 1 :(得分:1)

我看到这样做的一种方法是通过get /index/type/_search { "aggs": { "distinct_cat": { "terms": { "field": "categorie.keyword", "size":50 } } } } SearchResponse response = client.prepareSearch(indexName).setTypes(typeName) .addAggregation(AggregationBuilders.terms("distinct_sous_Categorie").size(100).field("sous_Categorie.keyword")) .get(); System.out.println(response); Terms terms = response.getAggregations().get("distinct_sous_Categorie"); List<String> distinctLineStatuts = new ArrayList<String>(); // For each entry for (Terms.Bucket entry : terms.getBuckets()) { distinctLineStatuts.add(entry.getKey().toString()); // Term System.out.println(entry.getDocCount()); // Doc count } System.out.println(terms.getBuckets().size()); SkipPolicy的组合。

该策略允许您跳过引发异常的项目,例如SkipListener(可以配置可跳过的异常)。

侦听器允许您访问FlatFileParseException和导致它的项目(或者在读取的情况下只是Throwable)。跳过侦听器还允许您区分读/处理器/写入器中的跳过,如果您想单独处理它们。

Throwable

我建议仅使用public class ErrorWritingSkipListener<T, S> implements SkipListener<T, S> { @Override public void onSkipInRead(final Throwable t) { // custom logic } @Override public void onSkipInProcess(final T itemThatFailed, final Throwable t) { // custom logic } @Override public void onSkipInWrite(final S itemThatFailed, final Throwable t) { // custom logic } } 来识别要写出各种文件的异常,并利用SkipPolicy来执行实际的文件写入逻辑。这将很好地与他们的接口定义的预期用途相匹配。