增加ResourceListener.different功能

This commit is contained in:
Redkale
2022-07-05 14:34:59 +08:00
parent 64eda4cdf7
commit 27d2433993
2 changed files with 24 additions and 7 deletions

View File

@@ -10,6 +10,7 @@ import java.lang.ref.WeakReference;
import java.lang.reflect.*; import java.lang.reflect.*;
import java.util.*; import java.util.*;
import java.util.concurrent.*; import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.*; import java.util.function.*;
import java.util.logging.*; import java.util.logging.*;
import javax.annotation.Resource; import javax.annotation.Resource;
@@ -847,7 +848,9 @@ public final class ResourceFactory {
} }
if (element.listener != null) { if (element.listener != null) {
try { try {
element.listener.invoke(dest, name, rs, oldVal); if (!element.different || !Objects.equals(rs, oldVal)) {
element.listener.invoke(dest, name, rs, oldVal);
}
} catch (Exception e) { } catch (Exception e) {
logger.log(Level.SEVERE, dest + " resource change listener error", e); logger.log(Level.SEVERE, dest + " resource change listener error", e);
} }
@@ -869,16 +872,20 @@ public final class ResourceFactory {
public final Method listener; public final Method listener;
public final boolean different;
public ResourceElement(T dest, Field field) { public ResourceElement(T dest, Field field) {
this.dest = new WeakReference(dest); this.dest = new WeakReference(dest);
this.field = field; this.field = field;
this.fieldType = field.getType(); this.fieldType = field.getType();
Class t = dest.getClass(); Class t = dest.getClass();
String tn = t.getName(); String tn = t.getName();
this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType()); AtomicBoolean diff = new AtomicBoolean();
this.listener = tn.startsWith("java.") || tn.startsWith("javax.") ? null : findListener(t, field.getType(), diff);
this.different = diff.get();
} }
private static Method findListener(Class clazz, Class fieldType) { private static Method findListener(Class clazz, Class fieldType, AtomicBoolean diff) {
synchronized (listenerMethods) { synchronized (listenerMethods) {
Class loop = clazz; Class loop = clazz;
Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName()); Method m = listenerMethods.get(clazz.getName() + "-" + fieldType.getName());
@@ -893,6 +900,7 @@ public final class ResourceFactory {
&& method.getParameterTypes()[1].isAssignableFrom(fieldType)) { && method.getParameterTypes()[1].isAssignableFrom(fieldType)) {
m = method; m = method;
m.setAccessible(true); m.setAccessible(true);
diff.set(method.getAnnotation(ResourceListener.class).different());
RedkaleClassLoader.putReflectionMethod(loop.getName(), method); RedkaleClassLoader.putReflectionMethod(loop.getName(), method);
break; break;
} }

View File

@@ -49,4 +49,13 @@ import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Retention(RUNTIME) @Retention(RUNTIME)
public @interface ResourceListener { public @interface ResourceListener {
/**
* 新旧值是否不同时才回调方法 <br>
* true: 新值与旧值不同时才回调ResourceListener方法
* false: 只要执行了ResourceFactory.register 就回调ResourceListener方法
*
* @since 2.7.0
* @return boolean
*/
boolean different() default true;
} }