in alpha/alpha-core/src/main/java/org/apache/servicecomb/pack/alpha/core/CompositeOmegaCallback.java [41:68]
public void compensate(TxEvent event) {
Map<String, OmegaCallback> serviceCallbacks = callbacks.getOrDefault(event.serviceName(), emptyMap());
OmegaCallback omegaCallback = serviceCallbacks.get(event.instanceId());
if (omegaCallback == null) {
LOG.info("Cannot find the service with the instanceId {}, call the other instance.", event.instanceId());
// TODO extract an Interface to let user define the serviceCallback instance pick strategy
Iterator<OmegaCallback> iterator = new ArrayList<>(serviceCallbacks.values()).iterator();
if(iterator.hasNext()) {
omegaCallback = iterator.next();
}
}
if(omegaCallback==null){
throw new AlphaException("No such omega callback found for service " + event.serviceName());
}
try {
omegaCallback.compensate(event);
} catch (CompensateConnectException e) {
serviceCallbacks.values().remove(omegaCallback);
throw e;
} catch (CompensateAckFailedException e) {
throw e;
} catch (Exception e) {
serviceCallbacks.values().remove(omegaCallback);
throw e;
}
}