1 /*******************************************************************************
2 * Copyright 2017 ZTE, Inc. and others.
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5 * in compliance with the License. You may obtain a copy of the License at
7 * http://www.apache.org/licenses/LICENSE-2.0
9 * Unless required by applicable law or agreed to in writing, software distributed under the License
10 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11 * or implied. See the License for the specific language governing permissions and limitations under
13 ******************************************************************************/
17 package org.onap.msb.sdk.httpclient.handler;
19 import java.lang.reflect.InvocationHandler;
20 import java.lang.reflect.Method;
22 import java.util.concurrent.atomic.AtomicReference;
24 import org.onap.msb.sdk.httpclient.ProxyRetrofitCall;
25 import org.onap.msb.sdk.httpclient.ServiceHttpEndPointObject;
26 import org.onap.msb.sdk.httpclient.exception.RetrofitServiceRuntimeException;
27 import org.onap.msb.sdk.httpclient.lb.LoadBalanceContext;
28 import org.slf4j.Logger;
29 import org.slf4j.LoggerFactory;
31 import jersey.repackaged.com.google.common.collect.Lists;
32 import retrofit2.Call;
38 public class RetrofitServiceHandler implements InvocationHandler {
40 private final static Logger logger = LoggerFactory.getLogger(RetrofitServiceHandler.class);
41 private static long periodTime = 60;
45 String periodStr = System.getenv("retrofit_route_cache_refresh_period");
46 periodTime = periodStr != null ? Long.valueOf(periodStr) : 60;
47 logger.info("retrofit_route_cache_refresh_period:" + periodTime);
48 } catch (Exception e) {
56 private RetrofitServiceHandlerContext flowContext;
58 private AtomicReference<Map<ServiceHttpEndPointObject, Object>> endPointToRetrofitRef =
59 new AtomicReference();
61 public RetrofitServiceHandler(RetrofitServiceHandlerContext flowContext) {
63 this.flowContext = flowContext;
64 logger.info("retrofit_route_cache_refresh_period:" + periodTime);
71 * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method,
75 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
77 Object retrofitObject = null;
78 ServiceHttpEndPointObjectWapper wapper = null;
81 wapper = selectRetrofitObjectByLBStrategy(
82 flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, null),
84 retrofitObject = wapper.retrofitObject;
86 Object resultObjecct = method.invoke(retrofitObject, args);
88 if (resultObjecct instanceof Call) {
89 Call targetCall = (Call) resultObjecct;
90 return new ProxyRetrofitCall(targetCall, this, wapper.endPoint, proxy, method, args);
96 public Object reInvoke(Object proxy, Method method, Object[] args,
97 ServiceHttpEndPointObject endPoint) throws Throwable {
100 Object retrofitObject = null;
101 ServiceHttpEndPointObjectWapper wapper = null;
105 Map<ServiceHttpEndPointObject, Object> serviceHttpEndPointObjectMap =
106 flowContext.getRetrofitObjectBuilder().buildRetrofitObject(endPointToRetrofitRef, endPoint);
108 wapper = selectRetrofitObjectByLBStrategy(serviceHttpEndPointObjectMap, method, args);
112 retrofitObject = wapper.retrofitObject;
114 Object resultObjecct = method.invoke(retrofitObject, args);
116 return resultObjecct;
120 private void updateMsbInfo() {
124 if (System.currentTimeMillis() - flowContext.getLastUpdateMsbTime() > periodTime * 1000) {
129 public void clean() {
130 endPointToRetrofitRef.set(null);
134 private ServiceHttpEndPointObjectWapper selectRetrofitObjectByLBStrategy(
135 Map<ServiceHttpEndPointObject, Object> srvEndPointToRetrofit, Method method, Object[] args)
136 throws RetrofitServiceRuntimeException {
138 LoadBalanceContext ctx = new LoadBalanceContext();
139 ctx.setEndPoints(Lists.newArrayList(srvEndPointToRetrofit.keySet()));
141 ctx.setMethod(method);
142 ServiceHttpEndPointObject endPoint = flowContext.getLbStrategy().chooseEndPointObject(ctx);
143 return new ServiceHttpEndPointObjectWapper(endPoint, srvEndPointToRetrofit.get(endPoint));
149 class ServiceHttpEndPointObjectWapper {
151 protected ServiceHttpEndPointObject endPoint;
152 protected Object retrofitObject;
154 public ServiceHttpEndPointObjectWapper(ServiceHttpEndPointObject endPoint,
155 Object retrofitObject) {
157 this.endPoint = endPoint;
158 this.retrofitObject = retrofitObject;