package com.yiqiniu.easytrans.protocol.cps; import java.io.Serializable; import com.yiqiniu.easytrans.protocol.ExecuteOrder; import com.yiqiniu.easytrans.protocol.RpcBusinessProvider; /** * Methods here all should be Idempotent<br/> * Idempotent can implement by framework or business code<br/> * * if business coder decide to implement by business code, the following situation should be consider:<br/> * <ul> * <li>all methods here must be Idempotent</li> * <li>compensation may execute before doCompensableBusiness,and you should not throw an exception but register it</li> * <li>after compensation executed,doCompensableBusiness should directory return and do nothing</li> * </ul> */ public interface CompensableMethod<P extends CompensableMethodRequest<R>, R extends Serializable> extends RpcBusinessProvider<P>{ /** * finish the the business code * @param param * @return */ @ExecuteOrder(doNotExecuteAfter = { "compensation" }, ifNotExecutedReturnDirectly = {}, isSynchronousMethod=true) R doCompensableBusiness(P param); /** * roll back the business code in doCompensableBusiness * @param param */ @ExecuteOrder(doNotExecuteAfter = {}, ifNotExecutedReturnDirectly = {"doCompensableBusiness"}) void compensation(P param); }