我尝试在此处开发一个方案,我的代码必须使用quarkus框架异步,下面是我的代码的片段:
@Inject
ThreadContext threadContext;
@Inject
ManagedExecutor managedExecutor
@Transactional
@ActivateRequestContext
private void asyncMethod(DataAccessAuthorisationEntity dataAccess) {
dataAccess.setStatus(IN_PROGRESS);//!!!!!!!!!
dataAccessAuthorisationRepository.persist(dataAccess);
threadContext.withContextCapture(CompletableFuture.completedFuture("T")).runAsync(()->{
logger.info("[][][] for dataAccess id we begin the treatement "+dataAccess.getId());
boolean exit = false;
PortfolioEntity portfolioEntity = portfolioRepository.findById(dataAccess.getPortfolioId());
System.out.println("");
try {
logger.info("[BEGIN][copyFileAfterSharing] for data access id= "+dataAccess.getId());
String portfolioId = portfolioEntity.getExternalId() + "_" + portfolioEntity.getExternalIdType().getCode();
fileService.copyFileOnAnotherServer(new CopyObject(portfolioId, dataAccess.getStartPoint().toString(),
dataAccess.getEmitterOrganisationId(), dataAccess.getRecipientOrganisationId()));
} catch (Exception e) {
dataAccess.setStatus(PENDING);//!!!!!!!!!
dataAccessAuthorisationRepository.persist(dataAccess);
logger.info("[ERROR][copyFileAfterSharing][BELLOW STACKTRACE] for data access id= "+dataAccess.getId());
e.printStackTrace();
exit= true;
}
},managedExecutor);
}
但是当我的执行通过异常捕获传递时,我总是得到的,而当我调用dataAccessAuthorisationRepository.persist(dataAccess)时,我得到:
交易未激活,请考虑将@Transactional添加到您的 自动激活一个的方法。
因为我在同一笔交易中两次更新了实体dataAccess
答案 0 :(得分:0)
Quarkus 在您注入的实例周围创建一个代理包装器。当您调用托管 bean 的方法时,您实际上调用了这个代理对象,它处理注释。如果您通过“this”调用方法。 Bean-container/proxy 不会检测到这个调用,因为调用没有通过它。您不能对带有“this”的调用使用注释。