Java 在Apache ServiceComb补偿方法中处理附加数据
我目前正在研究用于分布式事务的saga模式的实现,我发现apacheservicecomp包可能适合我 但是,我发现了一个问题,即补偿方法与它们补偿的方法具有相同声明的限制可能是一个瓶颈 根据Apache的示例: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
@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();
}
}