簡體   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