diff options
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; + } + +} |