diff options
author | HuabingZhao <zhao.huabing@zte.com.cn> | 2017-08-17 19:39:44 +0800 |
---|---|---|
committer | HuabingZhao <zhao.huabing@zte.com.cn> | 2017-08-17 19:40:21 +0800 |
commit | 798ccdc010e4628f6638602a4426444a68c0c52a (patch) | |
tree | 418cd6a1976bde54b16f6e94057b81cd15a1479f /src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java | |
parent | b91bf4fe6611e74f2c527c339d51e61193ec0a06 (diff) |
msb http client
Issue-Id: MSB-22
Change-Id: I79714244d675e193a0bf6bf64085e76a02e937e3
Signed-off-by: HuabingZhao <zhao.huabing@zte.com.cn>
Diffstat (limited to 'src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java')
-rw-r--r-- | src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java b/src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java new file mode 100644 index 0000000..7b886d6 --- /dev/null +++ b/src/main/java/org/onap/msb/sdk/httpclient/handler/RetrofitServiceHandler.java @@ -0,0 +1,162 @@ +/******************************************************************************* + * Copyright 2017 ZTE, Inc. and others. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express + * or implied. See the License for the specific language governing permissions and limitations under + * the License. + ******************************************************************************/ +/** + * + */ +package org.onap.msb.sdk.httpclient.handler; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; + +import org.onap.msb.sdk.httpclient.ProxyRetrofitCall; +import org.onap.msb.sdk.httpclient.ServiceHttpEndPointObject; +import org.onap.msb.sdk.httpclient.exception.RetrofitServiceRuntimeException; +import org.onap.msb.sdk.httpclient.lb.LoadBalanceContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import jersey.repackaged.com.google.common.collect.Lists; +import retrofit2.Call; + +/** + * @author 10071214 + * + */ +public class RetrofitServiceHandler implements InvocationHandler { + + private final static Logger logger = LoggerFactory.getLogger(RetrofitServiceHandler.class); + private static long periodTime = 60; + + static { + try { + String periodStr = System.getenv("retrofit_route_cache_refresh_period"); + periodTime = periodStr != null ? Long.valueOf(periodStr) : 60; + logger.info("retrofit_route_cache_refresh_period:" + periodTime); + } catch (Exception e) { + logger.warn("", e); + } + + } + + + + private RetrofitServiceHandlerContext flowContext; + + private AtomicReference<Map<ServiceHttpEndPointObject, Object>> endPointToRetrofitRef = + new AtomicReference(); + + public RetrofitServiceHandler(RetrofitServiceHandlerContext flowContext) { + super(); + this.flowContext = flowContext; + logger.info("retrofit_route_cache_refresh_period:" + periodTime); + } + + + /* + * (non-Javadoc) + * + * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, + * java.lang.Object[]) + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + + Object retrofitObject = null; + ServiceHttpEndPointObjectWapper wapper = null; + + updateMsbInfo(); + wapper = selectRetrofitObjectByLBStrategy( + flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, null), + method, args); + retrofitObject = wapper.retrofitObject; + + Object resultObjecct = method.invoke(retrofitObject, args); + + if (resultObjecct instanceof Call) { + Call targetCall = (Call) resultObjecct; + return new ProxyRetrofitCall(targetCall, this, wapper.endPoint, proxy, method, args, + flowContext.getMetricmanager().getMetricObject(method)); + } + return resultObjecct; + } + + + public Object reInvoke(Object proxy, Method method, Object[] args, + ServiceHttpEndPointObject endPoint) throws Throwable { + + + Object retrofitObject = null; + ServiceHttpEndPointObjectWapper wapper = null; + + updateMsbInfo(); + + Map<ServiceHttpEndPointObject, Object> serviceHttpEndPointObjectMap = + flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, endPoint); + + wapper = selectRetrofitObjectByLBStrategy(serviceHttpEndPointObjectMap, method, args); + + + + retrofitObject = wapper.retrofitObject; + + Object resultObjecct = method.invoke(retrofitObject, args); + + return resultObjecct; + + } + + private void updateMsbInfo() { + + + + if (System.currentTimeMillis() - flowContext.getLastUpdateMsbTime() > periodTime * 1000) { + clean(); + } + } + + public void clean() { + endPointToRetrofitRef.set(null); + } + + + private ServiceHttpEndPointObjectWapper selectRetrofitObjectByLBStrategy( + Map<ServiceHttpEndPointObject, Object> srvEndPointToRetrofit, Method method, Object[] args) + throws RetrofitServiceRuntimeException { + + LoadBalanceContext ctx = new LoadBalanceContext(); + ctx.setEndPoints(Lists.newArrayList(srvEndPointToRetrofit.keySet())); + ctx.setArgs(args); + ctx.setMethod(method); + ServiceHttpEndPointObject endPoint = flowContext.getLbStrategy().chooseEndPointObject(ctx); + return new ServiceHttpEndPointObjectWapper(endPoint, srvEndPointToRetrofit.get(endPoint)); + } + +} + + +class ServiceHttpEndPointObjectWapper { + + protected ServiceHttpEndPointObject endPoint; + protected Object retrofitObject; + + public ServiceHttpEndPointObjectWapper(ServiceHttpEndPointObject endPoint, + Object retrofitObject) { + super(); + this.endPoint = endPoint; + this.retrofitObject = retrofitObject; + } + +} |