Search in sources :

Example 1 with Switcher

use of com.weibo.api.motan.switcher.Switcher in project motan by weibocom.

the class RefererInvocationHandler method invoke.

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (isLocalMethod(method)) {
        if ("toString".equals(method.getName())) {
            return clustersToString();
        }
        throw new MotanServiceException("can not invoke local method:" + method.getName());
    }
    DefaultRequest request = new DefaultRequest();
    request.setRequestId(RequestIdGenerator.getRequestId());
    request.setArguments(args);
    String methodName = method.getName();
    boolean async = false;
    if (methodName.endsWith(MotanConstants.ASYNC_SUFFIX) && method.getReturnType().equals(ResponseFuture.class)) {
        methodName = MotanFrameworkUtil.removeAsyncSuffix(methodName);
        async = true;
    }
    RpcContext.getContext().putAttribute(MotanConstants.ASYNC_SUFFIX, async);
    request.setMethodName(methodName);
    request.setParamtersDesc(ReflectUtil.getMethodParamDesc(method));
    request.setInterfaceName(interfaceName);
    request.setAttachment(URLParamType.requestIdFromClient.getName(), String.valueOf(RequestIdGenerator.getRequestIdFromClient()));
    // 那么正常情况下只会使用A,如果A被开关降级,那么就会使用B,B也被降级,那么会使用C
    for (Cluster<T> cluster : clusters) {
        String protocolSwitcher = MotanConstants.PROTOCOL_SWITCHER_PREFIX + cluster.getUrl().getProtocol();
        Switcher switcher = switcherService.getSwitcher(protocolSwitcher);
        if (switcher != null && !switcher.isOn()) {
            continue;
        }
        request.setAttachment(URLParamType.version.getName(), cluster.getUrl().getVersion());
        request.setAttachment(URLParamType.clientGroup.getName(), cluster.getUrl().getGroup());
        // 带上client的application和module
        request.setAttachment(URLParamType.application.getName(), ApplicationInfo.getApplication(cluster.getUrl()).getApplication());
        request.setAttachment(URLParamType.module.getName(), ApplicationInfo.getApplication(cluster.getUrl()).getModule());
        Response response = null;
        boolean throwException = Boolean.parseBoolean(cluster.getUrl().getParameter(URLParamType.throwException.getName(), URLParamType.throwException.getValue()));
        try {
            response = cluster.call(request);
            if (async && response instanceof ResponseFuture) {
                return response;
            } else {
                return response.getValue();
            }
        } catch (RuntimeException e) {
            if (ExceptionUtil.isBizException(e)) {
                Throwable t = e.getCause();
                // 只抛出Exception,防止抛出远程的Error
                if (t != null && t instanceof Exception) {
                    throw t;
                } else {
                    String msg = t == null ? "biz exception cause is null" : ("biz exception cause is throwable error:" + t.getClass() + ", errmsg:" + t.getMessage());
                    throw new MotanServiceException(msg, MotanErrorMsgConstant.SERVICE_DEFAULT_ERROR);
                }
            } else if (!throwException) {
                LoggerUtil.warn("RefererInvocationHandler invoke false, so return default value: uri=" + cluster.getUrl().getUri() + " " + MotanFrameworkUtil.toString(request), e);
                return getDefaultReturnValue(method.getReturnType());
            } else {
                LoggerUtil.error("RefererInvocationHandler invoke Error: uri=" + cluster.getUrl().getUri() + " " + MotanFrameworkUtil.toString(request), e);
                throw e;
            }
        }
    }
    throw new MotanServiceException("Referer call Error: cluster not exist, interface=" + clz.getName() + " " + MotanFrameworkUtil.toString(request), MotanErrorMsgConstant.SERVICE_UNFOUND);
}
Also used : Response(com.weibo.api.motan.rpc.Response) DefaultRequest(com.weibo.api.motan.rpc.DefaultRequest) Switcher(com.weibo.api.motan.switcher.Switcher) ResponseFuture(com.weibo.api.motan.rpc.ResponseFuture) MotanServiceException(com.weibo.api.motan.exception.MotanServiceException) MotanServiceException(com.weibo.api.motan.exception.MotanServiceException)

Example 2 with Switcher

use of com.weibo.api.motan.switcher.Switcher in project motan by weibocom.

the class LocalSwitcherServiceTest method testProtocolSwitcher.

@Test
public void testProtocolSwitcher() {
    String protocolSwitcher = MotanConstants.PROTOCOL_SWITCHER_PREFIX + "motan";
    LocalSwitcherService localSwitcherService = new LocalSwitcherService();
    localSwitcherService.setValue(protocolSwitcher, false);
    Switcher switcher = localSwitcherService.getSwitcher(protocolSwitcher);
    Assert.assertNotNull(switcher);
    Assert.assertFalse(switcher.isOn());
    localSwitcherService.setValue(protocolSwitcher, true);
    switcher = localSwitcherService.getSwitcher(protocolSwitcher);
    Assert.assertNotNull(switcher);
    Assert.assertTrue(switcher.isOn());
}
Also used : Switcher(com.weibo.api.motan.switcher.Switcher) LocalSwitcherService(com.weibo.api.motan.switcher.LocalSwitcherService) Test(org.junit.Test)

Aggregations

Switcher (com.weibo.api.motan.switcher.Switcher)2 MotanServiceException (com.weibo.api.motan.exception.MotanServiceException)1 DefaultRequest (com.weibo.api.motan.rpc.DefaultRequest)1 Response (com.weibo.api.motan.rpc.Response)1 ResponseFuture (com.weibo.api.motan.rpc.ResponseFuture)1 LocalSwitcherService (com.weibo.api.motan.switcher.LocalSwitcherService)1 Test (org.junit.Test)1