/* * Copyright 2009-2016 Weibo, Inc. * * 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 com.weibo.api.motan.rpc; import java.util.concurrent.atomic.AtomicInteger; import com.weibo.api.motan.exception.MotanFrameworkException; import com.weibo.api.motan.util.MotanFrameworkUtil; /** * abstract referer * * @author maijunsheng * * @param <T> */ public abstract class AbstractReferer<T> extends AbstractNode implements Referer<T> { protected Class<T> clz; protected AtomicInteger activeRefererCount = new AtomicInteger(0); protected URL serviceUrl; public AbstractReferer(Class<T> clz, URL url) { super(url); this.clz = clz; this.serviceUrl = url; } public AbstractReferer(Class<T> clz, URL url, URL serviceUrl) { super(url); this.clz = clz; this.serviceUrl = serviceUrl; } @Override public Class<T> getInterface() { return clz; } @Override public Response call(Request request) { if (!isAvailable()) { throw new MotanFrameworkException(this.getClass().getSimpleName() + " call Error: node is not available, url=" + url.getUri() + " " + MotanFrameworkUtil.toString(request)); } incrActiveCount(request); Response response = null; try { response = doCall(request); return response; } finally { decrActiveCount(request, response); } } @Override public int activeRefererCount() { return activeRefererCount.get(); } protected void incrActiveCount(Request request) { activeRefererCount.incrementAndGet(); } protected void decrActiveCount(Request request, Response response) { activeRefererCount.decrementAndGet(); } protected abstract Response doCall(Request request); @Override public String desc() { return "[" + this.getClass().getSimpleName() + "] url=" + url; } @Override public URL getServiceUrl() { return serviceUrl; } }