|
|
|
@ -33,9 +33,7 @@ public class GlueFactory { |
|
|
|
|
* groovy class loader |
|
|
|
|
*/ |
|
|
|
|
private GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); |
|
|
|
|
|
|
|
|
|
private static final ConcurrentHashMap<String, Class<?>> CLASS_CACHE = new ConcurrentHashMap<>(); |
|
|
|
|
private static final ConcurrentHashMap<Long, String> JOBID_MD5KEY_CACHE = new ConcurrentHashMap<>(); |
|
|
|
|
private ConcurrentHashMap<String, Class<?>> CLASS_CACHE = new ConcurrentHashMap<>(); |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* load new instance, prototype |
|
|
|
@ -44,9 +42,9 @@ public class GlueFactory { |
|
|
|
|
* @return |
|
|
|
|
* @throws Exception |
|
|
|
|
*/ |
|
|
|
|
public IJobHandler loadNewInstance(long jobId, String codeSource) throws Exception{ |
|
|
|
|
public IJobHandler loadNewInstance(String codeSource) throws Exception{ |
|
|
|
|
if (codeSource!=null && codeSource.trim().length()>0) { |
|
|
|
|
Class<?> clazz = getCodeSourceClass(jobId, codeSource); |
|
|
|
|
Class<?> clazz = getCodeSourceClass(codeSource); |
|
|
|
|
if (clazz != null) { |
|
|
|
|
Object instance = clazz.newInstance(); |
|
|
|
|
if (instance!=null) { |
|
|
|
@ -62,38 +60,30 @@ public class GlueFactory { |
|
|
|
|
} |
|
|
|
|
throw new IllegalArgumentException(">>>>>>>>>>> xxl-glue, loadNewInstance error, instance is null"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* inject service of bean field |
|
|
|
|
* |
|
|
|
|
* @param instance |
|
|
|
|
*/ |
|
|
|
|
public void injectService(Object instance) { |
|
|
|
|
// do something
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Class<?> getCodeSourceClass(long jobId, String codeSource){ |
|
|
|
|
private Class<?> getCodeSourceClass(String codeSource){ |
|
|
|
|
try { |
|
|
|
|
MessageDigest md = MessageDigest.getInstance("MD5"); |
|
|
|
|
byte[] md5 = md.digest(codeSource.getBytes()); |
|
|
|
|
BigInteger no = new BigInteger(1, md5); |
|
|
|
|
String md5Str = no.toString(16); |
|
|
|
|
// md5
|
|
|
|
|
byte[] md5 = MessageDigest.getInstance("MD5").digest(codeSource.getBytes()); |
|
|
|
|
String md5Str = new BigInteger(1, md5).toString(16); |
|
|
|
|
|
|
|
|
|
Class<?> clazz = CLASS_CACHE.get(md5Str); |
|
|
|
|
if(clazz == null){ |
|
|
|
|
clazz = groovyClassLoader.parseClass(codeSource); |
|
|
|
|
Class<?> preClazz = CLASS_CACHE.putIfAbsent(md5Str, clazz); |
|
|
|
|
|
|
|
|
|
// 如果代碼有變化則刪除之前class緩存
|
|
|
|
|
if(preClazz == null){ |
|
|
|
|
String preMd5 = JOBID_MD5KEY_CACHE.put(jobId, md5Str); |
|
|
|
|
if(preMd5 != null){ |
|
|
|
|
CLASS_CACHE.remove(preMd5); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
CLASS_CACHE.putIfAbsent(md5Str, clazz); |
|
|
|
|
} |
|
|
|
|
return clazz; |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
return groovyClassLoader.parseClass(codeSource); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* inject service of bean field |
|
|
|
|
* |
|
|
|
|
* @param instance |
|
|
|
|
*/ |
|
|
|
|
public void injectService(Object instance) { |
|
|
|
|
// do something
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|