我有一个分区的Spring Batch作业,它读取几个拆分的CSV文件并在每个线程中处理每个文件,然后将结果写入相应的输出文件。
如果某个项目无法处理(抛出异常),我想将该结果写入错误文件。有没有办法添加一个可以处理这个的编写器或监听器?
更进一步,有没有办法通过异常类型将其拆分并将不同的异常写入不同的文件?
答案 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
来执行实际的文件写入逻辑。这将很好地与他们的接口定义的预期用途相匹配。