diff --git a/src/main/java/org/redkale/asm/AsmMethodBoost.java b/src/main/java/org/redkale/asm/AsmMethodBoost.java index d3325ebb4..84ae1ff73 100644 --- a/src/main/java/org/redkale/asm/AsmMethodBoost.java +++ b/src/main/java/org/redkale/asm/AsmMethodBoost.java @@ -91,6 +91,7 @@ public abstract class AsmMethodBoost { * * @param classLoader ClassLoader * @param cw 动态字节码Writer + * @param serviceImplClass 原始实现类 * @param newDynName 动态新类名 * @param fieldPrefix 动态字段的前缀 * @param filterAnns 需要过滤的注解 @@ -101,6 +102,7 @@ public abstract class AsmMethodBoost { public abstract String doMethod( ClassLoader classLoader, ClassWriter cw, + Class serviceImplClass, String newDynName, String fieldPrefix, List> filterAnns, @@ -180,7 +182,10 @@ public abstract class AsmMethodBoost { for (Annotation ann : anns) { if (ann.annotationType() != selfAnnType && (filterAnns == null || !filterAnns.contains(ann.annotationType()))) { - Asms.visitAnnotation(mv.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); + Asms.visitAnnotation( + mv.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), + ann.annotationType(), + ann); } } // 给参数加上原有的Annotation @@ -188,7 +193,9 @@ public abstract class AsmMethodBoost { for (int k = 0; k < annss.length; k++) { for (Annotation ann : annss[k]) { Asms.visitAnnotation( - mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), ann); + mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), + ann.annotationType(), + ann); } } } @@ -301,6 +308,7 @@ public abstract class AsmMethodBoost { public String doMethod( ClassLoader classLoader, ClassWriter cw, + Class serviceImplClass, String newDynName, String fieldPrefix, List> filterAnns, @@ -309,7 +317,15 @@ public abstract class AsmMethodBoost { String newName = newMethodName; for (AsmMethodBoost item : items) { if (item != null) { - newName = item.doMethod(classLoader, cw, newDynName, fieldPrefix, filterAnns, method, newName); + newName = item.doMethod( + classLoader, + cw, + serviceImplClass, + newDynName, + fieldPrefix, + filterAnns, + method, + newName); } } return newName; diff --git a/src/main/java/org/redkale/asm/Asms.java b/src/main/java/org/redkale/asm/Asms.java index cfb2b585b..f59ededf8 100644 --- a/src/main/java/org/redkale/asm/Asms.java +++ b/src/main/java/org/redkale/asm/Asms.java @@ -3,6 +3,10 @@ */ package org.redkale.asm; +import java.lang.annotation.Annotation; +import java.lang.reflect.Method; +import java.util.HashSet; +import java.util.Set; import static org.redkale.asm.Opcodes.BIPUSH; import static org.redkale.asm.Opcodes.CHECKCAST; import static org.redkale.asm.Opcodes.GETSTATIC; @@ -10,9 +14,6 @@ import static org.redkale.asm.Opcodes.ICONST_0; import static org.redkale.asm.Opcodes.INVOKESTATIC; import static org.redkale.asm.Opcodes.INVOKEVIRTUAL; import static org.redkale.asm.Opcodes.SIPUSH; - -import java.lang.annotation.Annotation; -import java.lang.reflect.Method; import org.redkale.util.RedkaleException; /** @@ -36,9 +37,18 @@ public final class Asms { false); } - public static void visitAnnotation(final AnnotationVisitor av, final Annotation ann) { + // annType与annValue不一定是同一类型 + public static void visitAnnotation( + final AnnotationVisitor av, final Class annType, final Annotation annValue) { try { - for (Method anm : ann.annotationType().getMethods()) { + Set methods = null; + if (annType != annValue.annotationType()) { + methods = new HashSet<>(); + for (Method anm : annType.getMethods()) { + methods.add(anm.getName()); + } + } + for (Method anm : annValue.annotationType().getMethods()) { final String mname = anm.getName(); if ("equals".equals(mname) || "hashCode".equals(mname) @@ -46,7 +56,10 @@ public final class Asms { || "annotationType".equals(mname)) { continue; } - final Object r = anm.invoke(ann); + if (methods != null && !methods.contains(mname)) { + continue; + } + final Object r = anm.invoke(annValue); if (r instanceof String[]) { AnnotationVisitor av1 = av.visitArray(mname); for (String item : (String[]) r) { @@ -62,14 +75,15 @@ public final class Asms { } else if (r instanceof Enum[]) { AnnotationVisitor av1 = av.visitArray(mname); for (Enum item : (Enum[]) r) { - av1.visitEnum(null, Type.getDescriptor(item.getClass()), ((Enum) item).name()); + av1.visitEnum(null, Type.getDescriptor(item.getClass()), item.name()); } av1.visitEnd(); } else if (r instanceof Annotation[]) { AnnotationVisitor av1 = av.visitArray(mname); for (Annotation item : (Annotation[]) r) { visitAnnotation( - av1.visitAnnotation(null, Type.getDescriptor(((Annotation) item).annotationType())), + av1.visitAnnotation(null, Type.getDescriptor(((Annotation) r).annotationType())), + item.annotationType(), item); } av1.visitEnd(); @@ -80,6 +94,7 @@ public final class Asms { } else if (r instanceof Annotation) { visitAnnotation( av.visitAnnotation(null, Type.getDescriptor(((Annotation) r).annotationType())), + ((Annotation) r).annotationType(), (Annotation) r); } else { av.visit(mname, r); diff --git a/src/main/java/org/redkale/boot/ClassFilter.java b/src/main/java/org/redkale/boot/ClassFilter.java index d42c334ed..7b58367b6 100644 --- a/src/main/java/org/redkale/boot/ClassFilter.java +++ b/src/main/java/org/redkale/boot/ClassFilter.java @@ -340,6 +340,16 @@ public final class ClassFilter { if (className.startsWith("java.") || className.startsWith("javax.")) { return false; } + return acceptPattern(className); + } + + /** + * 判断class是否符合正则表达式 + * + * @param className Class + * @return boolean + */ + public boolean acceptPattern(String className) { if (excludePatterns != null) { for (Pattern reg : excludePatterns) { if (reg.matcher(className).matches()) { diff --git a/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java b/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java index f9b9b296b..e90d9efe2 100644 --- a/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java +++ b/src/main/java/org/redkale/cached/spi/CachedAsmMethodBoost.java @@ -63,6 +63,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost { public String doMethod( final ClassLoader classLoader, final ClassWriter cw, + final Class serviceImplClass, final String newDynName, final String fieldPrefix, final List filterAnns, @@ -105,7 +106,7 @@ public class CachedAsmMethodBoost extends AsmMethodBoost { // mv.setDebug(true); AnnotationVisitor av = mv.visitAnnotation(cacheDynDesc, true); av.visit("dynField", dynFieldName); - Asms.visitAnnotation(av, cached); + Asms.visitAnnotation(av, DynForCached.class, cached); visitRawAnnotation(method, newMethodName, mv, Cached.class, filterAnns); Label l0 = new Label(); diff --git a/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java b/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java index 4656e2a56..d51a69fd5 100644 --- a/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java +++ b/src/main/java/org/redkale/locked/spi/LockedAsmMethodBoost.java @@ -39,6 +39,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost { public String doMethod( ClassLoader classLoader, ClassWriter cw, + Class serviceImplClass, String newDynName, String fieldPrefix, List filterAnns, @@ -75,7 +76,7 @@ public class LockedAsmMethodBoost extends AsmMethodBoost { mv.visitLabel(l0); AnnotationVisitor av = mv.visitAnnotation(lockDynDesc, true); av.visit("dynField", dynFieldName); - Asms.visitAnnotation(av, locked); + Asms.visitAnnotation(av, DynForLocked.class, locked); visitRawAnnotation(method, newMethodName, mv, Locked.class, filterAnns); mv.visitVarInsn(ALOAD, 0); List insns = visitVarInsnParamTypes(mv, method, 0); diff --git a/src/main/java/org/redkale/mq/spi/MessageAgent.java b/src/main/java/org/redkale/mq/spi/MessageAgent.java index 21c8319e5..f3ab1d6c1 100644 --- a/src/main/java/org/redkale/mq/spi/MessageAgent.java +++ b/src/main/java/org/redkale/mq/spi/MessageAgent.java @@ -550,10 +550,10 @@ public abstract class MessageAgent implements MessageManager { } public Future onMessage(MessageConext context, String traceid, byte[] message) { + Convert c = this.convert; + MessageConsumer m = this.consumer; return messageAgent.submit(() -> { Traces.computeIfAbsent(traceid); - Convert c = this.convert; - MessageConsumer m = this.consumer; try { m.onMessage(context, (T) c.convertFrom(messageType, message)); } catch (Throwable t) { @@ -563,12 +563,17 @@ public abstract class MessageAgent implements MessageManager { Level.SEVERE, m.getClass().getSimpleName() + " onMessage error, topic: " + context.getTopic() - + ", messages: " + new String(message, StandardCharsets.UTF_8)); + + ", messages: " + new String(message, StandardCharsets.UTF_8), + t); } Traces.removeTraceid(); }); } + public MessageConsumer getConsumer() { + return consumer; + } + public void destroy(AnyValue config) { consumer.destroy(config); } diff --git a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java index 465d83842..f2aefc141 100644 --- a/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java +++ b/src/main/java/org/redkale/mq/spi/MessageAsmMethodBoost.java @@ -12,6 +12,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicInteger; +import org.redkale.annotation.AutoLoad; import org.redkale.asm.AnnotationVisitor; import org.redkale.asm.AsmMethodBean; import org.redkale.asm.AsmMethodBoost; @@ -83,6 +84,7 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { public String doMethod( ClassLoader classLoader, ClassWriter cw, + Class serviceImplClass, String newDynName, String fieldPrefix, List filterAnns, @@ -183,7 +185,12 @@ public class MessageAsmMethodBoost extends AsmMethodBoost { new String[] {messageConsumerName}); { AnnotationVisitor av = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(ResourceConsumer.class), true); - Asms.visitAnnotation(av, messaged); + Asms.visitAnnotation(av, ResourceConsumer.class, messaged); + av.visitEnd(); + } + { // 必须设置成@AutoLoad(false), 否则预编译打包后会被自动加载 + AnnotationVisitor av = cw.visitAnnotation(org.redkale.asm.Type.getDescriptor(AutoLoad.class), true); + av.visit("value", false); av.visitEnd(); } cw.visitInnerClass(innerFullName, newDynName, innerClassName, ACC_PUBLIC + ACC_STATIC); diff --git a/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java b/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java index e32e026c7..3de46f6b0 100644 --- a/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java +++ b/src/main/java/org/redkale/mq/spi/MessageModuleEngine.java @@ -18,6 +18,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.logging.Level; +import org.redkale.annotation.AutoLoad; import org.redkale.asm.AsmMethodBoost; import org.redkale.boot.Application; import org.redkale.boot.ClassFilter; @@ -266,6 +267,10 @@ public class MessageModuleEngine extends ModuleEngine { List> allEntrys = new ArrayList(allFilter.getFilterEntrys()); for (ClassFilter.FilterEntry en : allEntrys) { Class clazz = en.getType(); + AutoLoad auto = clazz.getAnnotation(AutoLoad.class); + if (auto != null && !auto.value()) { + continue; + } ResourceConsumer res = clazz.getAnnotation(ResourceConsumer.class); if (res != null && res.required() && findMessageAgent(res.mq()) == null) { throw new RedkaleException("Not found " + MessageAgent.class.getSimpleName() + "(name = " + res.mq() @@ -461,6 +466,11 @@ public class MessageModuleEngine extends ModuleEngine { || !Objects.equals(agent.getName(), environment.getPropertyValue(res.mq()))) { continue; } + AutoLoad auto = clazz.getAnnotation(AutoLoad.class); + if ((auto != null && !auto.value()) + && (filter.getIncludePatterns() == null || !filter.acceptPattern(clazz.getName()))) { + continue; + } RedkaleClassLoader.putReflectionDeclaredConstructors(clazz, clazz.getName()); final MessageConsumer consumer = clazz.getDeclaredConstructor().newInstance(); diff --git a/src/main/java/org/redkale/net/sncp/Sncp.java b/src/main/java/org/redkale/net/sncp/Sncp.java index 5aae29717..c1ad62c21 100644 --- a/src/main/java/org/redkale/net/sncp/Sncp.java +++ b/src/main/java/org/redkale/net/sncp/Sncp.java @@ -563,7 +563,8 @@ public abstract class Sncp { if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) { continue; } - Asms.visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); + Asms.visitAnnotation( + cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann.annotationType(), ann); } } { @@ -658,7 +659,7 @@ public abstract class Sncp { methodKeys.add(mk); List> filterAnns = methodBoost.filterMethodAnnotations(method); String newMethodName = - methodBoost.doMethod(classLoader, cw, newDynName, FIELDPREFIX, filterAnns, method, null); + methodBoost.doMethod(classLoader, cw, clazz, newDynName, FIELDPREFIX, filterAnns, method, null); if (newMethodName != null) { String desc = Type.getMethodDescriptor(method); AsmMethodBean methodBean = AsmMethodBean.get(methodBeans, method); @@ -1030,7 +1031,8 @@ public abstract class Sncp { if (ann instanceof Resource || ann instanceof SncpDyn || ann instanceof ResourceType) { continue; } - Asms.visitAnnotation(cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann); + Asms.visitAnnotation( + cw.visitAnnotation(Type.getDescriptor(ann.annotationType()), true), ann.annotationType(), ann); } } { @@ -1107,8 +1109,8 @@ public abstract class Sncp { String newMethodName = null; if (methodBoost != null) { List> filterAnns = methodBoost.filterMethodAnnotations(method); - newMethodName = - methodBoost.doMethod(classLoader, cw, newDynName, FIELDPREFIX, filterAnns, method, null); + newMethodName = methodBoost.doMethod( + classLoader, cw, serviceTypeOrImplClass, newDynName, FIELDPREFIX, filterAnns, method, null); } if (newMethodName != null) { acc = ACC_PRIVATE; @@ -1125,7 +1127,9 @@ public abstract class Sncp { for (int k = 0; k < anns.length; k++) { for (Annotation ann : anns[k]) { Asms.visitAnnotation( - mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), ann); + mv.visitParameterAnnotation(k, Type.getDescriptor(ann.annotationType()), true), + ann.annotationType(), + ann); } } }