如何解决在@Recover 方法上使用@Transaction 时出现异常
我正在尝试为我的数据库操作实现 @Retryable
和 @Recover
功能。
见下面我的示例代码
@Retryable(value = {PriceUploadServiceException.class,RuntimeException.class},maxAttempts = 3,backoff = @Backoff(10000))
@Transactional(value ="phoenixTxManager",propagation =Propagation.REQUIRED,rollbackForClassName ="PriceUploadServiceException")
public void insertUploadedData(UploadInsertReqDTO uploadInsertReq)
{
//Doing some insertion and update operation
}
@Modifying
@Transactional(value ="phoenixTxManager",rollbackForClassName ="PriceUploadServiceException")
@Recover
public void updatefailureStatus(RuntimeException ex,UploadInsertReqDTO uploadInsertReq)
{
//Doing some delete operation,If all the retry attempts got failed
logger.info("All Retry fails So Recover Invoked : "+uploadInsertReq.getSeqId());
Optional<AsyncProcessEntity> optAsync = asyncProcessRepo.findById(uploadInsertReq.getSeqId());
if(optAsync.isPresent())
{
AsyncProcessEntity asynObj = optAsync.get();
asyncProcessRepo.deleteById(asynObj.getAsyncProcessSeqId());
asynObj.setProcessStatus(AppConstants.FAILED);
phenixtEntityManager.persist(asynObj);
phenixtEntityManager.flush();
}
}
我在我的代码中尝试了上述逻辑,重试尝试工作正常,但是当我在 @Recover
方法中删除和插入记录时,我遇到了异常。即使我删除了 @Transactional
的 @Recover
方法
javax.persistence.TransactionRequiredException: No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call
at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298)
at com.sun.proxy.$Proxy193.persist(Unknown Source)
at com.tcs.opt.priceupload.service.PriceUploadService.updatefailureStatus(PriceUploadService.java:339)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:564)
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:282)
at org.springframework.retry.annotation.RecoverAnnotationRecoveryHandler.recover(RecoverAnnotationRecoveryHandler.java:73)
at org.springframework.retry.interceptor.RetryOperationsInterceptor$ItemRecovererCallback.recover(RetryOperationsInterceptor.java:141)
at org.springframework.retry.support.RetryTemplate.handleRetryExhausted(RetryTemplate.java:512)
at org.springframework.retry.support.RetryTemplate.doExecute(RetryTemplate.java:351)
at org.springframework.retry.support.RetryTemplate.execute(RetryTemplate.java:180)
at org.springframework.retry.interceptor.RetryOperationsInterceptor.invoke(RetryOperationsInterceptor.java:115)
请帮我解决这个问题,或者告诉我实现此功能的任何其他解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。