Quarkus异步

时间:2020-06-12 01:27:57

标签: java transactions quarkus

我尝试在此处开发一个方案,我的代码必须使用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

1 个答案:

答案 0 :(得分:0)

Quarkus 在您注入的实例周围创建一个代理包装器。当您调用托管 bean 的方法时,您实际上调用了这个代理对象,它处理注释。如果您通过“this”调用方法。 Bean-container/proxy 不会检测到这个调用,因为调用没有通过它。您不能对带有“this”的调用使用注释。