Skip to content

Commit

Permalink
1. 处理下rule的兼容性
Browse files Browse the repository at this point in the history
2. extension增加order信息
  • Loading branch information
agapple committed Nov 7, 2013
1 parent b6d6683 commit 97aa162
Show file tree
Hide file tree
Showing 22 changed files with 434 additions and 142 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
import java.util.concurrent.Executors;

import com.taobao.tddl.atom.common.TAtomConstants;
import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;
import com.taobao.tddl.config.ConfigDataHandler;
import com.taobao.tddl.config.ConfigDataHandlerFactory;
import com.taobao.tddl.config.ConfigDataListener;
import com.taobao.tddl.config.impl.ConfigDataHandlerCity;

import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;

/**
* 全局和应用的配置管理Diamond实现
*
Expand Down Expand Up @@ -103,10 +104,10 @@ public void registerAppDbConfListener(ConfigDataListener listener) {

public void stopDbConfManager() {
if (null != this.globalHandler) {
this.globalHandler.closeUnderManager();
this.globalHandler.destory();
}
if (null != this.appDBHandler) {
this.appDBHandler.closeUnderManager();
this.appDBHandler.destory();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,14 @@
import java.util.concurrent.Executors;

import com.taobao.tddl.atom.common.TAtomConstants;
import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;
import com.taobao.tddl.config.ConfigDataHandler;
import com.taobao.tddl.config.ConfigDataHandlerFactory;
import com.taobao.tddl.config.ConfigDataListener;
import com.taobao.tddl.config.impl.ConfigDataHandlerCity;

import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;

/**
* 密码管理器Diamond实现
*
Expand Down Expand Up @@ -66,7 +67,7 @@ public void setUnitName(String unitName) {

public void stopDbPasswdManager() {
if (null != this.passwdHandler) {
this.passwdHandler.closeUnderManager();
this.passwdHandler.destory();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.taobao.tddl.common.utils.extension;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* Activate
* <p />
* 对于可以被框架中自动激活加载扩展,此Annotation用于配置扩展被自动激活加载条件。比如,有多个实现可以定义加载优先级
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Activate {

int order() default 0;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,20 @@
package com.taobao.tddl.common.utils.extension;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.Comparator;
import java.util.Enumeration;
import java.util.List;
import java.util.Map;
import java.util.ServiceLoader;

import org.apache.commons.lang.exception.ExceptionUtils;

import com.google.common.collect.Lists;
import com.google.common.collect.Maps;

/**
* 包装{@linkplain ServiceLoader},提供SPI的获取方式 <br/>
* jdk自带的{@linkplain ServiceLoader}
Expand All @@ -14,6 +27,10 @@
*/
public class ExtensionLoader<S> {

private static final String SERVICES_DIRECTORY = "META-INF/services/";
private static final String TDDL_DIRECTORY = "META-INF/tddl/";
private static Map<Class, Class> providers = Maps.newConcurrentMap();

/**
* 指定classloader加载server provider
*
Expand All @@ -23,12 +40,7 @@ public class ExtensionLoader<S> {
* @throws ExtensionNotFoundException
*/
public static <S> S load(Class<S> service, ClassLoader loader) throws ExtensionNotFoundException {
ServiceLoader<S> result = ServiceLoader.load(service, loader);
for (S clazz : result) {
return clazz;
}

throw new ExtensionNotFoundException("not found service provider for : " + service.getName());
return loadFile(service, loader);
}

/**
Expand All @@ -39,11 +51,101 @@ public static <S> S load(Class<S> service, ClassLoader loader) throws ExtensionN
* @throws ExtensionNotFoundException
*/
public static <S> S load(Class<S> service) throws ExtensionNotFoundException {
ServiceLoader<S> result = ServiceLoader.load(service);
for (S clazz : result) {
return clazz;
return loadFile(service, findClassLoader());
}

private static <S> S loadFile(Class<S> service, ClassLoader loader) {
Class<?> extension = providers.get(service);
if (extension == null) {
synchronized (service) {
extension = providers.get(service);
if (extension == null) {
List<Class> extensions = Lists.newArrayList();
try {
loadFile(service, SERVICES_DIRECTORY, loader, extensions);
loadFile(service, TDDL_DIRECTORY, loader, extensions);
} catch (IOException e) {
throw new ExtensionNotFoundException("not found service provider for : " + service.getName()
+ " caused by " + ExceptionUtils.getFullStackTrace(e));
}

if (extensions.isEmpty()) {
throw new ExtensionNotFoundException("not found service provider for : " + service.getName());
}

// 做一下排序
Collections.sort(extensions, new Comparator<Class>() {

public int compare(Class c1, Class c2) {
Integer o1 = 0;
Integer o2 = 0;
Activate a1 = (Activate) c1.getAnnotation(Activate.class);
Activate a2 = (Activate) c2.getAnnotation(Activate.class);

if (a1 != null) {
o1 = a1.order();
}

if (a2 != null) {
o2 = a2.order();
}

return o1.compareTo(o2);

}
});

extension = extensions.get(extensions.size() - 1);// 最大的一个
}
}
}

try {
return service.cast(extension.newInstance());
} catch (InstantiationException e) {
throw new ExtensionNotFoundException("not found service provider for : " + service.getName()
+ " caused by " + ExceptionUtils.getFullStackTrace(e));
} catch (IllegalAccessException e) {
throw new ExtensionNotFoundException("not found service provider for : " + service.getName()
+ " caused by " + ExceptionUtils.getFullStackTrace(e));
}
}

private static void loadFile(Class<?> service, String dir, ClassLoader classLoader, List<Class> extensions)
throws IOException {
String fileName = dir + service.getName();
Enumeration<java.net.URL> urls;
if (classLoader != null) {
urls = classLoader.getResources(fileName);
} else {
urls = ClassLoader.getSystemResources(fileName);
}

if (urls != null) {
while (urls.hasMoreElements()) {
java.net.URL url = urls.nextElement();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "utf-8"));
String line = null;
while ((line = reader.readLine()) != null) {
final int ci = line.indexOf('#');
if (ci >= 0) {
line = line.substring(0, ci);
}
line = line.trim();
if (line.length() > 0) {
extensions.add(Class.forName(line, true, classLoader));
}
}
} catch (Throwable e) {
// ignore
}
}
}
}

throw new ExtensionNotFoundException("not found service provider for : " + service.getName());
private static ClassLoader findClassLoader() {
return Thread.currentThread().getContextClassLoader();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class ExtensionLoaderTest {
@Test
public void testSimple() {
AbstractPluginService plugin = ExtensionLoader.load(AbstractPluginService.class);
Assert.assertEquals(plugin.getClass(), ExamplePlugin.class);
Assert.assertEquals(plugin.echo("hello"), "hello");
Assert.assertEquals(plugin.getClass(), OrderedPlugin.class);
Assert.assertEquals(plugin.echo("hello"), "ordered : hello");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.taobao.tddl.common.extension;

import com.taobao.tddl.common.utils.extension.Activate;

@Activate(order = 1)
public class OrderedPlugin extends AbstractPluginService {

public String echo(String str) {
return "ordered : " + str;
}
}
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
com.taobao.tddl.common.extension.OrderedPlugin
com.taobao.tddl.common.extension.ExamplePlugin
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;

import com.taobao.diamond.client.impl.DiamondEnv;
Expand All @@ -12,6 +11,7 @@
import com.taobao.diamond.common.Constants;
import com.taobao.diamond.manager.ManagerListener;
import com.taobao.diamond.manager.SkipInitialCallbackListener;
import com.taobao.tddl.common.utils.extension.Activate;
import com.taobao.tddl.common.utils.mbean.TddlMBean;
import com.taobao.tddl.common.utils.mbean.TddlMBeanServer;
import com.taobao.tddl.config.ConfigDataListener;
Expand All @@ -29,23 +29,16 @@
* @since 1.6
* @date 2011-1-11 11:22:29
*/
@Activate(order = 1)
public class DiamondConfigDataHandler extends UnitConfigDataHandler {

private static final Logger logger = LoggerFactory.getLogger(DiamondConfigDataHandler.class);
public static final long TIMEOUT = 10 * 1000;
protected String dataId;
private String mbeanId;
private TddlMBean mbean;
private DiamondEnv env;

public void init(final String dataId, final List<ConfigDataListener> configDataListenerList,
final Map<String, Object> config) {
this.init(dataId, configDataListenerList, config, null);
}

public void init(final String dataId, final List<ConfigDataListener> configDataListenerList,
final Map<String, Object> config, String initialData) {
this.dataId = dataId;
public void doInit() {
mbean = new TddlMBean("Diamond Config Info " + System.currentTimeMillis());
mbeanId = dataId + System.currentTimeMillis();

Expand All @@ -59,7 +52,7 @@ public void init(final String dataId, final List<ConfigDataListener> configDataL
if (initialData == null) {
initialData = getData(TIMEOUT, FIRST_SERVER_STRATEGY);
}
addListener0(configDataListenerList, (Executor) config.get("executor"), initialData);
addListener0(listeners, (Executor) config.get("executor"), initialData);
TddlMBeanServer.registerMBeanWithId(mbean, mbeanId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,14 @@
import com.taobao.diamond.client.impl.DiamondUnitSite;
import com.taobao.diamond.domain.ConfigInfoEx;
import com.taobao.tddl.common.utils.TStringUtil;
import com.taobao.tddl.common.utils.extension.Activate;
import com.taobao.tddl.config.impl.holder.AbstractConfigDataHolder;
import com.taobao.tddl.config.impl.holder.ConfigDataHolder;

import com.taobao.tddl.common.utils.logger.Logger;
import com.taobao.tddl.common.utils.logger.LoggerFactory;

@Activate(order = 1)
public class DiamondConfigHolder extends AbstractConfigDataHolder {

private static final Logger log = LoggerFactory.getLogger(DiamondConfigHolder.class);
Expand All @@ -24,6 +26,10 @@ public class DiamondConfigHolder extends AbstractConfigDataHolder {

protected Map<String, String> configHouse = new HashMap<String, String>();

public void doInit() {

}

protected Map<String, String> queryAndHold(List<String> dataIds, String unitName) {
DiamondEnv env = null;

Expand Down Expand Up @@ -70,8 +76,4 @@ protected String getDataFromSonHolder(String dataId) {
return sonConfigDataHolder == null ? null : sonConfigDataHolder.getData(dataId);
}

@Override
public void init() {

}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.taobao.tddl.config;

import java.util.List;
import java.util.Map;
import java.util.concurrent.Executor;

import com.taobao.tddl.common.model.lifecycle.Lifecycle;

/**
* 获取配置的处理器
*
Expand All @@ -12,33 +13,12 @@
* @since 1.6
* @date 2011-1-11上午11:22:29
*/
public interface ConfigDataHandler {
public interface ConfigDataHandler extends Lifecycle {

public static final String FIRST_SERVER_STRATEGY = "firstServer";
public static final String FIRST_CACHE_THEN_SERVER_STRATEGY = "firstCache";
public static final long GET_DATA_TIMEOUT = 10 * 1000;

/**
* DefaultConfigDataHandler会在 实例化具体的Handler之后调用此方法 给予Handler相关信息
*
* @param dataId 数据在配置平台上注册的id
* @param listenerList 数据监听器列表
* @param prop 全局配置和运行时
*/
void init(String dataId, List<ConfigDataListener> listenerList, Map<String, Object> prop);

/**
* 允许指定initialData进行初始化
*
* @param dataId
* @param configDataListenerList
* @param config
* @param unitName
* @param initialData
*/
void init(final String dataId, final List<ConfigDataListener> configDataListenerList,
final Map<String, Object> config, String initialData);

/**
* 从配置中心拉取数据
*
Expand Down Expand Up @@ -73,8 +53,4 @@ void init(final String dataId, final List<ConfigDataListener> configDataListener
*/
void addListeners(List<ConfigDataListener> configDataListenerList, Executor executor);

/**
* 停止底层配置管理器
*/
void closeUnderManager();
}
Loading

0 comments on commit 97aa162

Please sign in to comment.