2015-06-09 21 views
0

我正在使用Spring和JPA進行財務數據處理項目。我必須爲將來的日期處理日程安排交易。在日常運行的石英克朗工作和執行所有的時間表交易,並堅持到真正的表。如何處理與JPA的逆轉?

我的問題是,當執行某個給定時間的觸發器時,由於某種原因導致一條記錄失敗,那麼所有其他記錄都沒有執行。

我需要執行所有其他事務,失敗的事務應該回滾。

有沒有辦法處理這些事情?

下面的代碼塊得到的所有日程安排工作

public void bankingPaymentSchedullerRun(){ 

// get all pending job 
List<BankScheduler> bankSchedulers = bankSchedulerDao.findByStatus(ScheduleStatus.PENDING); 
Calendar currentDate = DateUtil.getFormatedCalenderDate(DateUtil.currentDate(), "yyyy-MM-dd"); 
if (bankSchedulers != null) { 
    for (BankScheduler bankScheduler : bankSchedulers) { 
    LOGGER.info("bankingPaymentSchedullerRun " + bankScheduler.toString()); 
    //compare from date and to date 
    if ((bankScheduler.getFromDate().compareTo(currentDate) <= 0) 
     && (bankScheduler.getToDate().compareTo(currentDate)) >= 0) { 

      if (bankScheduler.getSchedulerType().equals(SchedulerType.FUND_TRANSFER.toString())) { 
       scheduleFundTransfer(bankScheduler); 
      }else { 
       scheduleUtilityPayment(bankScheduler); 
      } 

     } 
    } 
} 

}

轉帳執行代碼塊

public PaymentResponse scheduleFundTransfer(final BankScheduler bankScheduler){ 

    FundTransfer fundTransfer = new FundTransfer(); 

    fundTransfer.setBranchName(bankScheduler.getBankSchedulerFundTransfer().getBeneficiaryBranchName()); 
    fundTransfer.setBeneficiaryBankName(bankScheduler.getBankSchedulerFundTransfer().getBeneficiaryBankName()); 
    fundTransfer.setBeneficiaryType(bankScheduler.getBankSchedulerFundTransfer().getBeneficiaryType()); 
    fundTransfer.setBeneficiaryName(bankScheduler.getBankSchedulerFundTransfer().getBeneficiaryName()); 
    fundTransfer.setCurrency(bankScheduler.getBankSchedulerFundTransfer().getCurrency()); 
    fundTransfer.setNarration(bankScheduler.getDetail()); 
    fundTransfer.setThirdPartyType(bankScheduler.getBankSchedulerFundTransfer().getThirdPartyType()); 
    fundTransfer.setTransferedAmount(bankScheduler.getBankSchedulerFundTransfer().getAmount()); 
    fundTransfer.setUserAccountNumber(bankScheduler.getBankSchedulerFundTransfer().getAccountNumber()); 
    fundTransfer.setUserName(bankScheduler.getBankSchedulerFundTransfer().getUserName()); 

    FundTransfer fundTransferUpdate = null; 
    //commit to fundtransfer real table 
    try { 
     fundTransferUpdate = fundTransferDao.create(fundTransfer); 
    } catch (Exception e) { 
     LOGGER.error("Exception occur when call update fund transfer in fundTransfer()", e); 
    } 

    // getting from currecy Decimals 
    BankCurrecyInfor currecyInfo = 
    bankCurrecyInforDao.getDecimalpointsByCurrecy(fundTransfer.getUserAccount().getCurrencyCode()); 
    fundTransferUpdate.setDecimalAmt(String.valueOf(currecyInfo.getNoOfDecimal())); 
    //call to bank back-end to update 
    PaymentResponse response = accountServiceInvoker.fundTransfer(fundTransferUpdate); 

    //for sending sms 
    SmsCriteria smsCriteria = new SmsCriteria(); 
    smsCriteria.setBank_name("ABC"); 
    messageServiceInvoker.sentIbSms(smsCriteria); 

    return response; 
} 
+0

這個問題將通過展示一些示例代碼,顯示您的cron作業是如何工作的更清晰。 –

+0

我已經添加了一些示例代碼 – Danushka

回答

0

是有,使用適當的異常處理,所以當單個事務失敗,其他將仍然(嘗試)執行。

for(scheduled task from all scheduled tasks) { 
    try{ 
     begin transaction 
     do your stuff with jpa 
     commit transaction 
    }catch(Exception e){ 
     rollback transaction, log error and stuff 
    }finally{ 
     release resources 
    } 

}