package com.hqyg.disjob.register.rpc;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.commons.collections4.CollectionUtils;
import com.hqyg.disjob.common.util.LoggerUtil;
import com.hqyg.disjob.rpc.client.HURL;
import com.hqyg.disjob.rpc.client.HURLParamType;
/**
* <pre>
*
* File: AbstractRegistry.java
*
* Copyright (c) 2016, globalegrow.com All Rights Reserved.
*
* Description:
* 订阅发现抽象类,主要是发现和通知逻辑
*
* Revision History
* Date, Who, What;
* 2016年5月12日 Disjob Initial.
*
* </pre>
*/
public abstract class AbstractRegistry implements DiscoveryService {
public final static ConcurrentHashMap<HURL, List<HURL>> subscribedCategoryResponses = new ConcurrentHashMap<HURL, List<HURL>>();
protected String registryClassName = this.getClass().getSimpleName();
public AbstractRegistry() {
}
public void unregister(HURL url){
}
public void register(HURL url){
}
//@Override
public void subscribe(HURL url, NotifyListener listener) {
if (url == null || listener == null) {
LoggerUtil.warn("[{}] subscribe with malformed param, url:{}, listener:{}", registryClassName, url, listener);
return;
}
LoggerUtil.warn("[{}] Listener ({}) will subscribe to url ({}) in Registry [{}]", registryClassName, listener, url);
doSubscribe(url.createCopy(), listener);
}
@Override
public void unsubscribe(HURL url ,NotifyListener listener) {
if (url == null || listener == null) {
LoggerUtil.warn("[{}] unsubscribe with malformed param, url:{}, listener:{}", registryClassName, url, listener);
return;
}
LoggerUtil.info("[{}] Listener ({}) will unsubscribe from url ({}) in Registry [{}]", registryClassName, listener, url
);
doUnsubscribe(url.createCopy(), listener);
}
/**
* 发现注册服务的URL,直接从本地缓存中取
*/
@SuppressWarnings("unchecked")
@Override
public List<HURL> discover(HURL url) {
if (url == null) {
LoggerUtil.warn("[{}] discover with malformed param, refUrl is null", registryClassName);
return Collections.EMPTY_LIST;
}
url = url.createCopy();
List<HURL> results = new ArrayList<HURL>();
List<HURL> categoryUrls = subscribedCategoryResponses.get(url);
synchronized (subscribedCategoryResponses) {
if (CollectionUtils.isNotEmpty(categoryUrls)) {
for (HURL tempUrl : categoryUrls) {
results.add(tempUrl.createCopy());
}
} else {
List<HURL> urlsDiscovered = doDiscover(url);
//add 把查询到的数据同步更新到缓存中,正常情况下发现的数据应该都有
subscribedCategoryResponses.put(url, urlsDiscovered);
//
if (urlsDiscovered != null) {
for (HURL u : urlsDiscovered) {
results.add(u.createCopy());
}
}
}
}
return results;
}
protected List<HURL> getCachedUrls(HURL url) {
List<HURL> rsUrls = subscribedCategoryResponses.get(url);
List<HURL> urls = new ArrayList<HURL>();
synchronized (subscribedCategoryResponses) {
if (rsUrls == null || rsUrls.size() == 0) {
return null;
}
for (HURL tempUrl : rsUrls) {
urls.add(tempUrl.createCopy());
}
}
return urls;
}
/**
* 移除不必提交到注册中心的参数。这些参数不需要被client端感知。
*
* @param url
*/
private HURL removeUnnecessaryParmas(HURL url) {
// codec参数不能提交到注册中心,如果client端没有对应的codec会导致client端不能正常请求。
url.getParameters().remove(HURLParamType.codec.getName());
return url;
}
protected abstract void doSubscribe(HURL url, NotifyListener listener);
protected abstract void doUnsubscribe(HURL url, NotifyListener listener);
protected abstract List<HURL> doDiscover(HURL url);
protected abstract void doAvailable(HURL url);
protected abstract void doUnavailable(HURL url);
}