Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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 在Apache ServiceComb补偿方法中处理附加数据_Java_Apache_Microservices_Rollback_Distributed Transactions - Fatal编程技术网

Java 在Apache ServiceComb补偿方法中处理附加数据

Java 在Apache ServiceComb补偿方法中处理附加数据,java,apache,microservices,rollback,distributed-transactions,Java,Apache,Microservices,Rollback,Distributed Transactions,我目前正在研究用于分布式事务的saga模式的实现,我发现apacheservicecomp包可能适合我 但是,我发现了一个问题,即补偿方法与它们补偿的方法具有相同声明的限制可能是一个瓶颈 根据Apache的示例: @Compensable(compensationMethod = "cancel") void order(CarBooking booking) { booking.confirm(); bookings.put(booking.getId(), booki

我目前正在研究用于分布式事务的saga模式的实现,我发现apacheservicecomp包可能适合我

但是,我发现了一个问题,即补偿方法与它们补偿的方法具有相同声明的限制可能是一个瓶颈

根据Apache的示例:

  @Compensable(compensationMethod = "cancel")
  void order(CarBooking booking) {
    booking.confirm();
    bookings.put(booking.getId(), booking);
  }

  void cancel(CarBooking booking) {
    Integer id = booking.getId();
    if (bookings.containsKey(id)) {
      bookings.get(id).cancel();
    }
  }
您可以看到,这两种方法的声明是相同的

但是,如果我需要额外的信息来补偿我的交易呢?例如,我调用外部系统将某些标志更新为“true”。当我需要对其进行补偿时,如何使“取消”方法知道该标志的原始值是多少

当我们更新整个对象时,事情变得更加棘手。如何在修改之前将整个对象发送到cancel事务


这些限制看起来不太有希望。您知道是否有办法克服此限制吗?

您可以在应用程序中保存localTxId并标记an,然后在补偿方法中使用localTxId来获取标记


Map extmap=newhashmap();
@自动连线
OmegaContext OmegaContext;
@可补偿(补偿方法=“取消”)
无效订单(车载预订){
预订。确认();
bookings.put(booking.getId(),booking);
//保存标志
put(omegaContext.localTxId(),“您的标志”)
}
作废取消(车载预订){
//拿旗
get(omegaContext.localTxId());
整数id=booking.getId();
if(预订。集装箱(id)){
bookings.get(id.cancel();
}
}