5

在我当前的 Web 应用程序中,我将 @RestController 与 CompletableFuture 结果一起用于所有服务。

数据库操作是异步的(CompletableFuture 方法),但我只想在发送结果之前提交操作

我想在 --save-- 异步结束后提交数据库修改(--save-- 是未来业务的列表)

@RestController
public class MyController {
...

  @RequestMappping(...)
  public CompletableFuture<ResponseEntity<AnyResource>> service(...){

   CompletableFuture ...
   .thenCompose(--check--)
   .thenAsync(--save--)
   ...ect
   .thenApply(
      return ResponseEntity.ok().body(theResource);
    );
  }

}

-> 我尝试过使用@Transactional,但它不起作用(在方法结束时提交,但异步方法部分或未执行

-> 其他编程方式:

@RequestMappping(...)
public CompletableFuture<ResponseEntity<AnyResource>> service(...){

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// explicitly setting the transaction name is something that can only be done programmatically
def.setName("SomeTxName");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);

TransactionStatus status = this.platformTransactionManager.getTransaction(def);

CompletableFuture ...
   .thenCompose(--check--)
   .thenAsync(--save--)
   ...ect
   .thenApply(

this.platformTransactionManager.commit(status)

      return ResponseEntity.ok().body(theResource);
    );

}

发生错误“无法停用事务同步 - 未激活”,推测是因为不是同一个线程。

有没有合适的方法来使用 CompletableFuture 的事务性?

4

0 回答 0