java - 在@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", propagation =Propagation.REQUIRED, 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)
请帮我解决这个问题,或者告诉我任何其他解决方案来实现这个功能。
解决方案
推荐阅读
- python - 在 composer.json 中为 Heroku 包含 Python 库
- javascript - 在反应中构建人口图表时输出错误
- java - 如何在 Java 中的 PApplet 中绘制图片背景?
- windows - 每当我创建一个新分支时,它都会显示存储在 master 分支中的所有文件,它应该是空的
- java - 在每个文本区域行中创建 if 语句以查看它是否为空
- assembly - 如何将 cs: 与 NASM 风格相配?
- java - 为什么在运行时垂直调整 Frame 大小后 JRadioButtons 会出现故障?
- swift - 创建一个快速帮助类来处理 CoreLocation 函数
- sql - 多表信息的条件比较
- swift - 我是在创建两个单例对象还是只是一个参考?