使用spring批处理在csv上修改期间处理异常

时间:2014-01-08 10:36:26

标签: java spring csv

我有一个巨大的csv文件。我想通过spring批处理修改这个文件。我使用了FlatFileItemReader和FlatFileItemWriter。如果在执行spring批处理期间抛出异常会发生什么?我想要的是以下内容:

如果在执行spring批处理期间发生错误,我想跳过这一行并继续修改csv。在春季批处理结束时,我想查看哪些行导致错误,因此无法写入。

假设ItemProcessor中出现错误:

import java.math.BigDecimal;
import java.util.ArrayList;

import org.springframework.batch.item.ItemProcessor;

public class MyItemProcessor implements ItemProcessor<Product, ArrayList<String>> {

@Override
public ArrayList<String> process(final Product product) throws Exception {

    if (product.getId().equals("PRODUCT_ID210")) {
        BigDecimal price = new BigDecimal(130);
        product.setPrice(price);
    }

    if (product.getId().equals("PRODUCT_ID211")) {
        throw new RuntimeException();
    }

    if (product.getId().equals("PRODUCT_ID21")) {
        BigDecimal price = new BigDecimal(140);
        product.setPrice(price);
    }

    return product.getDetails();

}

}

在这种情况下,spring批处理停止并显示错误消息: ERROR executor-1(AbstractStep.java:222):遇到执行该步骤的错误 了java.lang.RuntimeException     在job.batch.MyItemProcessor.process(MyItemProcessor.java:20)

当然,我可以写一个try-catch,但这不是我们想要的,是吗?

顺便说一句:csv看起来像 PRODUCT_ID; NAME;说明; PRICE PRODUCT_ID210; BlackBerry 8100 Pearl;手机; 124.60 PRODUCT_ID211;索尼爱立信W810i;又一款手机!; 139.45 PRODUCT_ID212;三星MM-A900M Ace;一部手机; 97.80 PRODUCT_ID213; Toshiba M285-E 14;手机; 166.20 PRODUCT_ID214;诺基亚2610手机;一部手机; 145.50

1 个答案:

答案 0 :(得分:0)

解决方案是@OnSkipInRead @OnSkipInProcess @OnSkipInWrite注释和一些带有skipListener的可跳过异常类。