繁体   English   中英

批量中的Spring Batch异常

[英]Spring Batch Exception in Chunk

我有一个春季批处理工作,其中包含多个步骤。

步骤1:从数据库中加载10条记录。 (Tasklet可以完成这项工作)

第2步:使用提交-interval = 1的ItemReader,ItemProcessor,ItemWriter实现在此处配置块处理

据我了解,每笔记录都会发生

开始事务(读取-处理-写入)提交Tx

  1. 我的问题是想象它处理了六个记录,而现在有了第7条记录,它在ItemProcessor实现中出现了异常,它试图回滚,但由于事务处于未知状态而无法回滚

  2. 即使它无法回滚第7条记录的tx,也根本不会处理第8、9、10条记录,并且作业已停止。

注意:ItemProcessor实现正在调用使用@Transactional(readOnly = false)注释标记为事务性的服务(已注释@Service)。

请提出解决方案。

下面的ItemProcessor代码

public Long process(LoanApplication loanApplication)throws Exception {
    Long createLoan = null;
    LoanStatus loanStatus = null;
    StaffUser user = staffUserService.getStaffUserByName(Constants.AUTO_USER);
    String notes = null;
    try{
        try{

            loanValidationService.validate(loanApplication);

            loanStatus=LoanStatus.U;

        }catch(LoanValidationException e){
            loanStatus=LoanStatus.UC;
            notes=e.getMessage();
        }

        dataLoadLoanManagementService.setText(notes);
        createLoan = dataLoadLoanManagementService.createLoan(loanApplication, user,loanStatus);
    }catch(Exception le){
        logger.error("Error creating the loan application ;  Parent Application Ref : " 
            + loanApplication
            + " with status as " +(loanStatus!=null ?loanStatus.getStatus():loanStatus)
            +"\n"
            +" School Ref :"
            + loanApplication.getSchoolRef()
            +"\n"
            +" Client Details :"
            +loanApplication.getClientDetails()
            + "Error Details: " + ExceptionUtils.getStackTrace(le));


    }   
    return createLoan;
}

即使配置了可跳过的异常类,它也不起作用。
为了进一步说明,我在Item Processor中获得了Persistence Exception并捕获了它,因此Spring Batch执行了writer,但是在执行完writer之后,我得到了下面的异常

INFO  06-21 11:38:00 Commit failed while step execution data was already updated. Reverting to old version.  (TaskletStep.java:342) 
ERROR 06-21 11:38:00 Rolling back with transaction in unknown state  (TaskletStep.java:351) 
ERROR 06-21 11:38:00 Encountered an error executing the step  (AbstractStep.java:212)
org.springframework.transaction.TransactionSystemException: Could not commit JPA   transaction; nested exception is javax.persistence.RollbackException: Transaction marked as rollbackOnly

对于您的两个问题,跳过在处理阶段发生的异常将解决您的问题。

如果您知道异常的根本原因,则可以通过skippable-exception-classes元素来配置它。 例如,如果您在处理器阶段得到除以零的异常并且想忽略它,则示例配置可能是:

<chunk reader="reader" processor="processor" writer="writer" 
commit-interval="1" >
<skippable-exception-classes>
<include class="java.lang.ArithmeticException" />
</skippable-exception-classes>
</chunk>

由于将跳过给定的异常类及其子类,因此您甚至可以尝试java.lang.Exception

在loanValidationService.validate检查交易传播选项

从“将事务标记为rollbackOnly的事务”中猜测,“在步骤执行数据已更新时提交失败”

当前事务已回滚,应提交父事务,但事务已结束。

如果块的事务在LoanValidationService.validate处相同

将传播选项更改为REQUIRES_NEW

以下文章可能有助于了解元数据的事务。 http://blog.codecentric.de/en/2012/03/transactions-in-spring-batch-part-1-the-basics/

    class LoanValidationServiceImpl implements LoanValidationService {
        @Trasnactional(propagation=REQUIRES_NEW, rollbackFor=Exception.class)
        validate(LoanApplication loanApplication) {
             // business logic
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM