From 33fd0dc31ee16a0c2ee9a6ec65317cc9c35feab7 Mon Sep 17 00:00:00 2001 From: quansong2021 Date: Sun, 27 Jun 2021 15:16:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20redisson/kafka-provider=E5=AD=90?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=BD=95=E5=88=B6=E5=92=8Cmock?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/package.sh | 2 + bin/repeater-config.json | 2 + .../repeater/plugin/domain/InvokeType.java | 4 ++ repeater-plugins/kafka-plugin/pom.xml | 36 +++++++++++ .../plugin/kafka/KafkaProviderPlugin.java | 55 +++++++++++++++++ .../plugin/kafka/KafkaProviderProcessor.java | 26 ++++++++ repeater-plugins/pom.xml | 2 + repeater-plugins/redisson-plugin/pom.xml | 36 +++++++++++ .../plugin/redisson/RedissonListener.java | 42 +++++++++++++ .../plugin/redisson/RedissonPlugin.java | 61 +++++++++++++++++++ .../plugin/redisson/RedissonProcessor.java | 38 ++++++++++++ 11 files changed, 304 insertions(+) create mode 100644 repeater-plugins/kafka-plugin/pom.xml create mode 100644 repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderPlugin.java create mode 100644 repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderProcessor.java create mode 100644 repeater-plugins/redisson-plugin/pom.xml create mode 100644 repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonListener.java create mode 100644 repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonPlugin.java create mode 100644 repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonProcessor.java diff --git a/bin/package.sh b/bin/package.sh index b21270d4..2e5259ee 100755 --- a/bin/package.sh +++ b/bin/package.sh @@ -28,6 +28,8 @@ cp ./repeater-logback.xml ${REPEATER_TARGET_DIR}/cfg/repeater-logback.xml \ && cp ../repeater-plugins/mybatis-plugin/target/mybatis-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/mybatis-plugin.jar \ && cp ../repeater-plugins/dubbo-plugin/target/dubbo-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/dubbo-plugin.jar \ && cp ../repeater-plugins/redis-plugin/target/redis-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/redis-plugin.jar \ + && cp ../repeater-plugins/redisson-plugin/target/redisson-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/redisson-plugin.jar \ + && cp ../repeater-plugins/kafka-plugin/target/kafka-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/kafka-plugin.jar \ && cp ../repeater-plugins/http-plugin/target/http-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/http-plugin.jar \ && cp ../repeater-plugins/hibernate-plugin/target/hibernate-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/hibernate-plugin.jar \ && cp ../repeater-plugins/spring-data-jpa-plugin/target/spring-data-jpa-plugin-*-jar-with-dependencies.jar ${REPEATER_TARGET_DIR}/plugins/spring-data-jpa-plugin.jar \ No newline at end of file diff --git a/bin/repeater-config.json b/bin/repeater-config.json index 66beb07a..48e01240 100644 --- a/bin/repeater-config.json +++ b/bin/repeater-config.json @@ -42,6 +42,8 @@ "java-subInvoke", "mybatis", "ibatis", + "redisson", + "kafka-provider", "dubbo-provider", "dubbo-consumer" ], diff --git a/repeater-plugin-api/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/domain/InvokeType.java b/repeater-plugin-api/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/domain/InvokeType.java index 5946c226..7e8f9cba 100644 --- a/repeater-plugin-api/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/domain/InvokeType.java +++ b/repeater-plugin-api/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/domain/InvokeType.java @@ -19,6 +19,10 @@ public class InvokeType implements java.io.Serializable { public static InvokeType REDIS = new InvokeType("redis"); + public static InvokeType REDISSON = new InvokeType("redisson"); + + public static InvokeType KAFKA = new InvokeType("kafka"); + public static InvokeType DUBBO = new InvokeType("dubbo"); public static InvokeType HIBERNATE = new InvokeType("hibernate"); diff --git a/repeater-plugins/kafka-plugin/pom.xml b/repeater-plugins/kafka-plugin/pom.xml new file mode 100644 index 00000000..2aa97952 --- /dev/null +++ b/repeater-plugins/kafka-plugin/pom.xml @@ -0,0 +1,36 @@ + + + + repeater-plugins + com.alibaba.jvm.sandbox + 1.0.0-SNAPSHOT + + 4.0.0 + + kafka-plugin + + + ${project.name}-${project.version} + + + org.apache.maven.plugins + maven-assembly-plugin + + + + attached + + package + + + jar-with-dependencies + + + + + + + + \ No newline at end of file diff --git a/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderPlugin.java b/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderPlugin.java new file mode 100644 index 00000000..5bcce7b8 --- /dev/null +++ b/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderPlugin.java @@ -0,0 +1,55 @@ +package com.alibaba.jvm.sandbox.repeater.plugin.kafka; + +import com.alibaba.jvm.sandbox.api.event.Event; +import com.alibaba.jvm.sandbox.repeater.plugin.api.InvocationProcessor; +import com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractInvokePluginAdapter; +import com.alibaba.jvm.sandbox.repeater.plugin.core.model.EnhanceModel; +import com.alibaba.jvm.sandbox.repeater.plugin.domain.InvokeType; +import com.alibaba.jvm.sandbox.repeater.plugin.spi.InvokePlugin; +import com.google.common.collect.Lists; + +import org.kohsuke.MetaInfServices; +import java.util.*; + +/** + * {@link KafkaProviderPlugin} kafka-producer子插件 + * + * @author quansong + * @version 1.0 + */ +@MetaInfServices(InvokePlugin.class) +public class KafkaProviderPlugin extends AbstractInvokePluginAdapter { + + @Override + protected List getEnhanceModels() { + EnhanceModel redisson = EnhanceModel.builder() + .classPattern("org.apache.kafka.clients.producer.KafkaProducer") + .methodPatterns(EnhanceModel.MethodPattern.transform("doSend")) + .watchTypes(Event.Type.BEFORE, Event.Type.RETURN, Event.Type.THROWS) + .build(); + return Lists.newArrayList(redisson); + } + + + @Override + protected InvocationProcessor getInvocationProcessor() { + return new KafkaProviderProcessor(getType()); + } + + @Override + public InvokeType getType() { + return InvokeType.KAFKA; + } + + @Override + public String identity() { + return "kafka-provider"; + } + + @Override + public boolean isEntrance() { + return false; + } + + +} diff --git a/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderProcessor.java b/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderProcessor.java new file mode 100644 index 00000000..abdb5ccf --- /dev/null +++ b/repeater-plugins/kafka-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/kafka/KafkaProviderProcessor.java @@ -0,0 +1,26 @@ +package com.alibaba.jvm.sandbox.repeater.plugin.kafka; + +import com.alibaba.jvm.sandbox.api.event.BeforeEvent; +import com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultInvocationProcessor; +import com.alibaba.jvm.sandbox.repeater.plugin.domain.InvokeType; + +/** + * {@link KafkaProviderProcessor} kafka-producer子插件 + * + * @author quansong + * @version 1.0 + */ +class KafkaProviderProcessor extends DefaultInvocationProcessor { + + KafkaProviderProcessor(InvokeType type) { + super(type); + } + + @Override + public Object[] assembleRequest(BeforeEvent event) { + // KafkaProducer#doSend(ProducerRecord record, Callback callback) + // callback存在不可序序列化异常 + return new Object[]{event.argumentArray[0]}; + } + +} diff --git a/repeater-plugins/pom.xml b/repeater-plugins/pom.xml index b8cd64c8..d4ac4bf7 100644 --- a/repeater-plugins/pom.xml +++ b/repeater-plugins/pom.xml @@ -17,6 +17,8 @@ http-plugin dubbo-plugin redis-plugin + redisson-plugin + kafka-plugin hibernate-plugin spring-data-jpa-plugin socketio-plugin diff --git a/repeater-plugins/redisson-plugin/pom.xml b/repeater-plugins/redisson-plugin/pom.xml new file mode 100644 index 00000000..e4981c92 --- /dev/null +++ b/repeater-plugins/redisson-plugin/pom.xml @@ -0,0 +1,36 @@ + + + + repeater-plugins + com.alibaba.jvm.sandbox + 1.0.0-SNAPSHOT + + 4.0.0 + + redisson-plugin + + + ${project.name}-${project.version} + + + org.apache.maven.plugins + maven-assembly-plugin + + + + attached + + package + + + jar-with-dependencies + + + + + + + + \ No newline at end of file diff --git a/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonListener.java b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonListener.java new file mode 100644 index 00000000..ec0b799b --- /dev/null +++ b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonListener.java @@ -0,0 +1,42 @@ +package com.alibaba.jvm.sandbox.repeater.plugin.redisson; + +import com.alibaba.jvm.sandbox.api.ProcessControlException; +import com.alibaba.jvm.sandbox.api.event.BeforeEvent; +import com.alibaba.jvm.sandbox.repeater.plugin.api.InvocationListener; +import com.alibaba.jvm.sandbox.repeater.plugin.api.InvocationProcessor; +import com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultEventListener; +import com.alibaba.jvm.sandbox.repeater.plugin.domain.*; + +/** + * {@link RedissonListener} redis客户端redisson子插件 + * + * @author quansong + * @version 1.0 + */ +public class RedissonListener extends DefaultEventListener { + + private static final String REDISSON_CLAAS_PATH = "org.redisson.Redisson"; + + RedissonListener(InvokeType invokeType, + boolean entrance, + InvocationListener listener, + InvocationProcessor processor) { + super(invokeType, entrance, listener, processor); + } + + /** + * 处理before事件 + * 通配符过滤Redisson类 + * + * @param event before事件 + */ + @Override + protected void doBefore(BeforeEvent event) throws ProcessControlException { + if(REDISSON_CLAAS_PATH.equalsIgnoreCase(event.javaClassName)){ + return; + } + super.doBefore(event); + } + + +} diff --git a/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonPlugin.java b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonPlugin.java new file mode 100644 index 00000000..a063794a --- /dev/null +++ b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonPlugin.java @@ -0,0 +1,61 @@ +package com.alibaba.jvm.sandbox.repeater.plugin.redisson; + +import com.alibaba.jvm.sandbox.api.event.Event; +import com.alibaba.jvm.sandbox.api.listener.EventListener; +import com.alibaba.jvm.sandbox.repeater.plugin.api.InvocationListener; +import com.alibaba.jvm.sandbox.repeater.plugin.api.InvocationProcessor; +import com.alibaba.jvm.sandbox.repeater.plugin.core.impl.AbstractInvokePluginAdapter; +import com.alibaba.jvm.sandbox.repeater.plugin.core.model.EnhanceModel; +import com.alibaba.jvm.sandbox.repeater.plugin.domain.InvokeType; +import com.alibaba.jvm.sandbox.repeater.plugin.spi.InvokePlugin; +import com.google.common.collect.Lists; + +import org.kohsuke.MetaInfServices; +import java.util.*; + +/** + * {@link RedissonPlugin} redis客户端redisson子插件 + * + * @author quansong + * @version 1.0 + */ +@MetaInfServices(InvokePlugin.class) +public class RedissonPlugin extends AbstractInvokePluginAdapter { + + @Override + protected List getEnhanceModels() { + EnhanceModel redisson = EnhanceModel.builder() + .classPattern("org.redisson.Redisson*") + .methodPatterns(EnhanceModel.MethodPattern.transform("*")) + .watchTypes(Event.Type.BEFORE, Event.Type.RETURN, Event.Type.THROWS) + .build(); + return Lists.newArrayList(redisson); + } + + + @Override + protected InvocationProcessor getInvocationProcessor() { + return new RedissonProcessor(getType()); + } + + @Override + public InvokeType getType() { + return InvokeType.REDISSON; + } + + @Override + public String identity() { + return "redisson"; + } + + @Override + public boolean isEntrance() { + return false; + } + + + @Override + protected EventListener getEventListener(InvocationListener listener) { + return new RedissonListener(getType(), isEntrance(), listener, getInvocationProcessor()); + } +} diff --git a/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonProcessor.java b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonProcessor.java new file mode 100644 index 00000000..1e5d12d3 --- /dev/null +++ b/repeater-plugins/redisson-plugin/src/main/java/com/alibaba/jvm/sandbox/repeater/plugin/redisson/RedissonProcessor.java @@ -0,0 +1,38 @@ +package com.alibaba.jvm.sandbox.repeater.plugin.redisson; + +import com.alibaba.jvm.sandbox.api.event.BeforeEvent; +import com.alibaba.jvm.sandbox.repeater.plugin.core.impl.api.DefaultInvocationProcessor; +import com.alibaba.jvm.sandbox.repeater.plugin.domain.InvokeType; +import org.apache.commons.lang3.reflect.FieldUtils; + +import java.lang.reflect.Field; + +/** + * {@link RedissonProcessor} redis客户端redisson子插件 + * + * @author quansong + * @version 1.0 + */ +class RedissonProcessor extends DefaultInvocationProcessor { + + RedissonProcessor(InvokeType type) { + super(type); + } + + @Override + public Object[] assembleRequest(BeforeEvent event) { + Object mapperMethod = event.target; + Object name = null; + Field field = FieldUtils.getField(mapperMethod.getClass(), "name", true); + if(field == null){ + return new Object[]{event.argumentArray}; + } + try { + name = field.get(mapperMethod); + return new Object[]{name, event.argumentArray}; + } catch (IllegalAccessException e) { + return new Object[]{event.argumentArray}; + } + } + +}