package org.distributeme.core.failing;
import org.distributeme.core.ClientSideCallContext;
import org.distributeme.core.routing.AbstractRouter;
import org.distributeme.core.routing.RegistrationNameProvider;
import org.distributeme.core.routing.Router;
/**
* This failing strategy / router combination fails over to a special failover service instance and stays there.
*
* @author another
* @version $Id: $Id
*/
public class Failover extends AbstractRouter implements FailingStrategy, RegistrationNameProvider, Router{
/**
* Target service if to failover to.
*/
private String failedOverServiceId = null;
/** {@inheritDoc} */
@Override
public String getServiceIdForCall(ClientSideCallContext callContext) {
if (!callContext.isFirstCall() && failedOverServiceId==null){
failedOverServiceId = callContext.getServiceId();
}
String ret = failedOverServiceId == null ? callContext.getServiceId() : failedOverServiceId;
return ret;
}
/**
* Suffix of the failover instance.
*/
public static final String SUFFIX = "-failover";
/** {@inheritDoc} */
@Override
public String getRegistrationName(String serviceId) {
return serviceId+SUFFIX;
}
/** {@inheritDoc} */
@Override
public void customize(String parameter) {
// not used.
}
/** {@inheritDoc} */
@Override
public FailDecision callFailed(ClientSideCallContext context) {
FailDecision ret = FailDecision.retryOnce();
ret.setTargetService(context.getServiceId()+SUFFIX);
return ret;
}
}