package com.dianping.pigeon.remoting.invoker.cluster; import com.dianping.pigeon.log.Logger; import com.dianping.pigeon.log.LoggerLoader; import com.dianping.pigeon.remoting.common.domain.InvocationRequest; import com.dianping.pigeon.remoting.common.domain.InvocationResponse; import com.dianping.pigeon.remoting.common.process.ServiceInvocationHandler; import com.dianping.pigeon.remoting.common.util.Constants; import com.dianping.pigeon.remoting.invoker.Client; import com.dianping.pigeon.remoting.invoker.ClientManager; import com.dianping.pigeon.remoting.invoker.config.InvokerConfig; import com.dianping.pigeon.remoting.invoker.domain.InvokerContext; import com.dianping.pigeon.remoting.invoker.util.InvokerUtils; public class FailsafeCluster implements Cluster { private ClientManager clientManager = ClientManager.getInstance(); private static final Logger logger = LoggerLoader.getLogger(FailsafeCluster.class); private static final InvocationResponse NO_RETURN_RESPONSE = InvokerUtils.createNoReturnResponse(); @Override public InvocationResponse invoke(final ServiceInvocationHandler handler, final InvokerContext invocationContext) throws Throwable { InvokerConfig<?> invokerConfig = invocationContext.getInvokerConfig(); InvocationRequest request = InvokerUtils.createRemoteCallRequest(invocationContext, invokerConfig); try { Client remoteClient = clientManager.getClient(invokerConfig, request, null); invocationContext.setClient(remoteClient); return handler.handle(invocationContext); } catch (Throwable t) { logger.error("", t); return NO_RETURN_RESPONSE; } } @Override public String getName() { return Constants.CLUSTER_FAILSAFE; } }