Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java @Spring中@Async方法的事务性_Java_Spring_Asynchronous_Transactions - Fatal编程技术网

Java @Spring中@Async方法的事务性

Java @Spring中@Async方法的事务性,java,spring,asynchronous,transactions,Java,Spring,Asynchronous,Transactions,我有一个场景,我调用三个@Transactional@Async方法。除了这三种方法都有自己的事务上下文外,其他方法都可以正常工作。我想在调用方法的事务上下文中执行它们 我的调用方法如下: @Transactional public void execute(BillingRequestDto requestDto) { try { LOGGER.info("Start Processing Request : {}", requestDto.getI

我有一个场景,我调用三个
@Transactional@Async
方法。除了这三种方法都有自己的事务上下文外,其他方法都可以正常工作。我想在调用方法的事务上下文中执行它们

我的调用方法如下:

 @Transactional
 public void execute(BillingRequestDto requestDto) {
        try {
            LOGGER.info("Start Processing Request : {}", requestDto.getId());
            List<Future<?>> futures = new ArrayList<>();
            futures.add(inboundProcessingService.execute(requestDto));
            futures.add(orderProcessingService.execute(requestDto));
            futures.add(waybillProcessingService.execute(requestDto));
            futures.stream().parallel().forEach(future -> {
                try {
                    future.get();
                } catch (Exception e) {
                    futures.forEach(future1 -> future1.cancel(true));
                    throw new FBMException(e);
                }
            });
            requestDto.setStatus(RequestStatus.SUCCESS.name());
            requestDto.setCompletedAt(new Date());   
            LOGGER.info("Done Processing Request : {}", requestDto.getId());

        } catch (Exception e) {
            requestDto.setStatus(RequestStatus.FAIL.name());
            requestDto.setCompletedAt(new Date());
            throw new FBMException(e);
        } 
    }
这三种方法的实现或多或少是相同的

现在,若这些方法中的任何一个出现故障,那个么只针对该方法回滚事务

我的要求是在调用方法事务上下文中运行所有三个方法,这样一个方法中的任何异常都将回滚所有三个方法

如果禁用
@Async
,此场景效果良好。有一些耗时的方法,所以我希望它们并行运行


请对此提出任何解决方案。

我想您应该使用spring进行编程控制。
主线程应该执行控制,如果任何线程抛出异常,您应该通知其他线程它们应该回滚


比如说,执行后的每个“事务性”线程都应该
wait()
,如果没有异常,只需执行
notifyAll()
,并在线程中执行事务提交,如果出现异常,则应调用
thread.interrupt()
并执行回滚。

我认为您的
@Async
方法可以抛出选中的异常

@Transactional<br>
@Async<br>
public Future<Void> execute(BillingRequestDto requestDto) throw RollBackParentTransactionException {
...
}
@Transactional
@异步
公共未来执行(BillingRequestDto requestDto)抛出RollBackParentTransactionException{ ... }
调用方可以使用以下注释进行注释:

@Transactional(rollbackFor = RollBackParentTransactionException.class)<br> 
public void execute(BillingRequestDto requestDto) { ... }
@Transactional(rollboor=RollBackParentTransactionException.class)
public void execute(BillingRequestDto requestDto){…}

这应该是可行的。

@Async
方法在单独的线程中执行,因此不能使用调用方的相同事务。
@Transactional(rollbackFor = RollBackParentTransactionException.class)<br> 
public void execute(BillingRequestDto requestDto) { ... }