zoukankan      html  css  js  c++  java
  • chunk writer 中需要对抛错的交易进行回滚,同时又要在其他表中记录是哪一笔交易记录失败

    首先根据我有限的知识判断,回滚之后进行写表,该写表动作只能使用listener来进行。

    考虑使用的listener有:ItemWriteListener     StepExecutionListener    ChunkListener

    我首先使用了ItemWriteListener,在 onWriteError(Exception exception, List items) 方法中对items进行了写表,后来发现被回滚,通过一步一步debug,看到确实该方法之后才是rollback。

    所以在该方法中写表是必定被回滚的。不符合我的需求。

    Chunk Writer我忘了为什么不用了,它有一个afterChunkError(ChunkContext context)方法,我忘了它会不会被回滚,但是有一点就是它无法取得到底是哪一条记录出错,反正最后我没有使用它

    经过仔细思考,我让我的listener类同时实现了ItemWriteListener和StepExecutionListener,并且定义了一个私有变量 private List<Extfundbatchrtxn> list;

    然后在onWriteError中将出错的记录放入list,而非立即写表

    @Override
        public void onWriteError(Exception exception, List items) {
            // TODO Auto-generated method stub
            list.addAll(items);
            log.debug("onWriteError ,item size: "+items.size());
        }

    然后在整个step结束之后再写表

    @Override
        public ExitStatus afterStep(StepExecution stepExecution) {
            // TODO Auto-generated method stub
            if(list.size()>0) {
                for (Extfundbatchrtxn extfundbatchrtxn : list) {
                    System.out.println("payeeacctnbr: " + extfundbatchrtxn.getPayeeacctnbr()+ "txnstat: " + extfundbatchrtxn.getTxnstat());
                    Extfundbatchrtxn record = new Extfundbatchrtxn();
                    record.setMseq(extfundbatchrtxn.getMseq());
                    record.setExttxnid(extfundbatchrtxn.getExttxnid());
                    record.setRtxnsourcecd(extfundbatchrtxn.getRtxnsourcecd());
                    record.setTxnstat("F");
                    DataAccessManager.getMapper(ExtfundbatchrtxnMapper.class).updateByPrimaryKeySelective(record);
                }
            }
            return null;
        }

     哦 对了,onWriteError方法参数中的list包含该批次处理的所有记录,并不仅仅只是出错的那一条。很明显我不能把正常的交易也回滚了,所以我在定义Chunk的时候增加了属性commit-interval = 1 ,这样每个事务只包含一条数据,那么我回滚的肯定也就是出错的那一条数据,记录的也是出错的那一条数据

    <chunk reader="extFundRtxnChargeDataProviderReader" writer="extFundRtxnChargeItemWriter" commit-interval="1"/>
  • 相关阅读:
    支持向量机 (三): 优化方法与支持向量回归
    支持向量机 (二): 软间隔 svm 与 核函数
    支持向量机 (一): 线性可分类 svm
    拉格朗日乘子法
    特征选择: 卡方检验、F 检验和互信息
    Python 多进程、多线程效率比较
    Umi+Dva搭建Cesium 3D开发环境
    React 项目生产版本迭代页面不刷新问题
    React-Native学习手册----搭建基于ios平台的开发环境
    Cesium 绘制点、线、面和测距
  • 原文地址:https://www.cnblogs.com/heben/p/6885276.html
Copyright © 2011-2022 走看看