From dc3396daf5411bbf41c31c702e534d2410c8dc61 Mon Sep 17 00:00:00 2001 From: redkale Date: Thu, 10 Oct 2024 14:28:03 +0800 Subject: [PATCH] sncp --- .../org/redkale/convert/ConvertFactory.java | 2 + .../org/redkale/net/sncp/SncpRemoteInfo.java | 16 ++-- .../org/redkale/net/sncp/SncpServlet.java | 20 ++--- src/main/java/org/redkale/util/Uint128.java | 2 +- .../redkale/test/sncp/SncpSleepService.java | 7 ++ .../org/redkale/test/sncp/SncpSleepTest.java | 3 + .../redkale/test/sncp/dyn/BooleanHandler.java | 21 +++++ .../sncp/dyn/DynActionTestService_change.java | 64 +++++++++++++++ .../dyn/DynActionTestService_changeName.java | 65 ++++++++++++++++ .../sncp/dyn/DynActionTestService_hello.java | 43 ++++++++++ .../sncp/dyn/DynActionTestService_insert.java | 69 ++++++++++++++++ .../sncp/dyn/DynActionTestService_update.java | 78 +++++++++++++++++++ .../redkale/test/sncp/dyn/TestService.java | 28 +++++++ .../test/sncp/dyn/TestServiceImpl.java | 40 ++++++++++ 14 files changed, 437 insertions(+), 21 deletions(-) create mode 100644 src/test/java/org/redkale/test/sncp/dyn/BooleanHandler.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_change.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_changeName.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_hello.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_update.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/TestService.java create mode 100644 src/test/java/org/redkale/test/sncp/dyn/TestServiceImpl.java diff --git a/src/main/java/org/redkale/convert/ConvertFactory.java b/src/main/java/org/redkale/convert/ConvertFactory.java index 35a5dd4f9..bc7765b24 100644 --- a/src/main/java/org/redkale/convert/ConvertFactory.java +++ b/src/main/java/org/redkale/convert/ConvertFactory.java @@ -1452,6 +1452,8 @@ public abstract class ConvertFactory { encoder = createStreamEncoder(type); } else if (Map.class.isAssignableFrom(clazz)) { encoder = createMapEncoder(type); + } else if (CompletionHandler.class.isAssignableFrom(clazz)) { + encoder = CompletionHandlerSimpledCoder.instance; } else if (Optional.class == clazz) { encoder = new OptionalCoder(this, type); } else if (clazz == Object.class) { diff --git a/src/main/java/org/redkale/net/sncp/SncpRemoteInfo.java b/src/main/java/org/redkale/net/sncp/SncpRemoteInfo.java index 7bcb15aa5..6dfa6c981 100644 --- a/src/main/java/org/redkale/net/sncp/SncpRemoteInfo.java +++ b/src/main/java/org/redkale/net/sncp/SncpRemoteInfo.java @@ -251,20 +251,14 @@ public class SncpRemoteInfo { protected SncpClientRequest createSncpClientRequest( SncpRemoteAction action, InetSocketAddress clientSncpAddress, String traceid, Object[] params) { final Type[] myParamTypes = action.paramTypes; - final Class[] myParamClass = action.paramClasses; if (action.paramAddressSourceIndex >= 0) { params[action.paramAddressSourceIndex] = clientSncpAddress; } byte[] body = null; - if (myParamTypes.length > 0) { + if (myParamTypes.length > 0) { // 存在参数 ProtobufWriter writer = convert.pollWriter(); for (int i = 0; i < params.length; i++) { // service方法的参数 - convert.convertTo( - writer, - CompletionHandler.class.isAssignableFrom(myParamClass[i]) - ? CompletionHandler.class - : myParamTypes[i], - params[i]); + convert.convertTo(writer, myParamTypes[i], params[i]); } body = writer.toByteArray().content(); convert.offerWriter(writer); @@ -404,7 +398,7 @@ public class SncpRemoteInfo { this.paramClasses = method.getParameterTypes(); this.method = method; Annotation[][] anns = method.getParameterAnnotations(); - int tpoicAddrIndex = -1; + int topicAddrIndex = -1; int targetAddrIndex = -1; int sourceAddrIndex = -1; int handlerAttachIndex = -1; @@ -479,7 +473,7 @@ public class SncpRemoteInfo { throw new SncpException( method + " have more than one @RpcTargetTopic parameter"); } else { - tpoicAddrIndex = i; + topicAddrIndex = i; } } else { throw new SncpException( @@ -490,7 +484,7 @@ public class SncpRemoteInfo { } } } - this.paramTopicTargetIndex = tpoicAddrIndex; + this.paramTopicTargetIndex = topicAddrIndex; this.paramAddressTargetIndex = targetAddrIndex; this.paramAddressSourceIndex = sourceAddrIndex; this.paramHandlerIndex = handlerFuncIndex; diff --git a/src/main/java/org/redkale/net/sncp/SncpServlet.java b/src/main/java/org/redkale/net/sncp/SncpServlet.java index 202e56559..663c82706 100644 --- a/src/main/java/org/redkale/net/sncp/SncpServlet.java +++ b/src/main/java/org/redkale/net/sncp/SncpServlet.java @@ -215,6 +215,8 @@ public class SncpServlet extends Servlet protected final java.lang.reflect.Type returnFutureResultType; // 返回结果的CompletableFuture的结果泛型类型 + protected final java.lang.reflect.Type paramComposeType; + protected SncpActionServlet( String resourceName, Class resourceType, @@ -226,6 +228,7 @@ public class SncpServlet extends Servlet Objects.requireNonNull(method); this.actionid = actionid; this.method = method; + this.paramComposeType = null; // 待实现 int handlerFuncIndex = -1; Class handlerFuncClass = null; @@ -292,8 +295,7 @@ public class SncpServlet extends Servlet } // Future代替CompletionStage 不容易判断异步 this.nonBlocking = non == null - ? (CompletionStage.class.isAssignableFrom(method.getReturnType()) || this.paramHandlerIndex >= 0) - : false; + && (CompletionStage.class.isAssignableFrom(method.getReturnType()) || this.paramHandlerIndex >= 0); } @Override @@ -335,7 +337,7 @@ public class SncpServlet extends Servlet *
* *
-         *      public interface TestService extends Service {
+         * public interface TestService extends Service {
          *
          *     public boolean change(TestBean bean, String name, int id);
          *
@@ -348,7 +350,7 @@ public class SncpServlet extends Servlet
          * }
          *
          * @ResourceType(TestService.class)
-         * class TestServiceImpl implements TestService {
+         * public class TestServiceImpl implements TestService {
          *
          *     @Override
          *     public boolean change(TestBean bean, String name, int id) {
@@ -369,7 +371,7 @@ public class SncpServlet extends Servlet
          *     }
          * }
          *
-         * class BooleanHandler implements CompletionHandler<Boolean, TestBean> {
+         * public class BooleanHandler implements CompletionHandler<Boolean, TestBean> {
          *
          *     @Override
          *     public void completed(Boolean result, TestBean attachment) {
@@ -381,7 +383,7 @@ public class SncpServlet extends Servlet
          *
          * }
          *
-         * class DynActionTestService_change extends SncpActionServlet {
+         * public class DynActionTestService_change extends SncpActionServlet {
          *
          *     public DynActionTestService_change(String resourceName, Class resourceType, Service service, Uint128 serviceid, Uint128 actionid, final Method method) {
          *         super(resourceName, resourceType, service, serviceid, actionid, method);
@@ -400,7 +402,7 @@ public class SncpServlet extends Servlet
          *     }
          * }
          *
-         * class DynActionTestService_insert extends SncpActionServlet {
+         * public class DynActionTestService_insert extends SncpActionServlet {
          *
          *     public DynActionTestService_insert(String resourceName, Class resourceType, Service service, Uint128 serviceid, Uint128 actionid, final Method method) {
          *         super(resourceName, resourceType, service, serviceid, actionid, method);
@@ -421,7 +423,7 @@ public class SncpServlet extends Servlet
          *     }
          * }
          *
-         * class DynActionTestService_update extends SncpActionServlet {
+         * public class DynActionTestService_update extends SncpActionServlet {
          *
          *     public DynActionTestService_update(String resourceName, Class resourceType, Service service, Uint128 serviceid, Uint128 actionid, final Method method) {
          *         super(resourceName, resourceType, service, serviceid, actionid, method);
@@ -444,7 +446,7 @@ public class SncpServlet extends Servlet
          *     }
          * }
          *
-         * class DynActionTestService_changeName extends SncpActionServlet {
+         * public class DynActionTestService_changeName extends SncpActionServlet {
          *
          *     public DynActionTestService_changeName(String resourceName, Class resourceType, Service service, Uint128 serviceid, Uint128 actionid, final Method method) {
          *         super(resourceName, resourceType, service, serviceid, actionid, method);
diff --git a/src/main/java/org/redkale/util/Uint128.java b/src/main/java/org/redkale/util/Uint128.java
index 792eb43f3..8697cebf3 100644
--- a/src/main/java/org/redkale/util/Uint128.java
+++ b/src/main/java/org/redkale/util/Uint128.java
@@ -135,7 +135,7 @@ public final class Uint128 extends Number implements Comparable {
                 | (((long) value[12] & 0xff) << 24)
                 | (((long) value[13] & 0xff) << 16)
                 | (((long) value[14] & 0xff) << 8)
-                | (((long) value[15] & 0xff)));
+                | ((long) value[15] & 0xff));
     }
 
     @Override
diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepService.java b/src/test/java/org/redkale/test/sncp/SncpSleepService.java
index 6aa364dc9..bd17cfd62 100644
--- a/src/test/java/org/redkale/test/sncp/SncpSleepService.java
+++ b/src/test/java/org/redkale/test/sncp/SncpSleepService.java
@@ -3,6 +3,9 @@
  */
 package org.redkale.test.sncp;
 
+import java.io.File;
+import java.io.Serializable;
+import java.util.Collection;
 import java.util.concurrent.CompletableFuture;
 import org.redkale.service.AbstractService;
 import org.redkale.util.Times;
@@ -46,4 +49,8 @@ public class SncpSleepService extends AbstractService {
                 },
                 getExecutor());
     }
+
+    public String test(Serializable id, String[] names, Collection files) {
+        return "ok";
+    }
 }
diff --git a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java
index 183f049ee..c07a2147f 100644
--- a/src/test/java/org/redkale/test/sncp/SncpSleepTest.java
+++ b/src/test/java/org/redkale/test/sncp/SncpSleepTest.java
@@ -1,6 +1,8 @@
 package org.redkale.test.sncp;
 
+import java.io.File;
 import java.net.InetSocketAddress;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import org.junit.jupiter.api.*;
@@ -62,6 +64,7 @@ public class SncpSleepTest {
         CompletableFuture.allOf(futures).join();
         long e = System.currentTimeMillis() - s;
         System.out.println("耗时: " + e + " ms");
+        remoteCService.test(333L, new String[] {"aaa", "bbb"}, List.of(new File("D:/a.txt"), new File("D:/b.txt")));
         server.shutdown();
         workExecutor.shutdown();
         Assertions.assertTrue(e < 600);
diff --git a/src/test/java/org/redkale/test/sncp/dyn/BooleanHandler.java b/src/test/java/org/redkale/test/sncp/dyn/BooleanHandler.java
new file mode 100644
index 000000000..2c96a4678
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/BooleanHandler.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.nio.channels.CompletionHandler;
+import org.redkale.test.util.TestBean;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class BooleanHandler implements CompletionHandler {
+
+    @Override
+    public void completed(Boolean result, TestBean attachment) {}
+
+    @Override
+    public void failed(Throwable exc, TestBean attachment) {}
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_change.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_change.java
new file mode 100644
index 000000000..d66c6017e
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_change.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.lang.reflect.Method;
+import org.redkale.convert.Convert;
+import org.redkale.convert.ConvertColumn;
+import org.redkale.convert.Reader;
+import org.redkale.convert.Writer;
+import org.redkale.net.sncp.SncpRequest;
+import org.redkale.net.sncp.SncpResponse;
+import org.redkale.net.sncp.SncpServlet.SncpActionServlet;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+import org.redkale.util.Uint128;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class DynActionTestService_change extends SncpActionServlet {
+
+    public DynActionTestService_change(
+            String resourceName,
+            Class resourceType,
+            Service service,
+            Uint128 serviceid,
+            Uint128 actionid,
+            final Method method) {
+        super(resourceName, resourceType, service, serviceid, actionid, method);
+    }
+
+    @Override
+    public void action(SncpRequest request, SncpResponse response) throws Throwable {
+        Convert convert = request.getConvert();
+        Reader in = request.getReader();
+        DynActionTestService_change_paramBean bean = convert.convertFrom(paramComposeType, in);
+        TestService serviceObj = (TestService) service();
+        Object rs = serviceObj.change(bean.arg1, bean.arg2, bean.arg3);
+        response.finish(boolean.class, rs);
+    }
+
+    public static class DynActionTestService_change_paramBean {
+
+        public DynActionTestService_change_paramBean() {}
+
+        public DynActionTestService_change_paramBean(Object[] params) {
+            this.arg1 = (TestBean) params[0];
+            this.arg2 = (String) params[1];
+            this.arg3 = (int) params[2];
+        }
+
+        @ConvertColumn(index = 1)
+        public TestBean arg1;
+
+        @ConvertColumn(index = 2)
+        public String arg2;
+
+        @ConvertColumn(index = 3)
+        public int arg3;
+    }
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_changeName.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_changeName.java
new file mode 100644
index 000000000..dd8345246
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_changeName.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.lang.reflect.Method;
+import java.util.concurrent.CompletableFuture;
+import org.redkale.convert.Convert;
+import org.redkale.convert.ConvertColumn;
+import org.redkale.convert.Reader;
+import org.redkale.convert.Writer;
+import org.redkale.net.sncp.SncpRequest;
+import org.redkale.net.sncp.SncpResponse;
+import org.redkale.net.sncp.SncpServlet.SncpActionServlet;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+import org.redkale.util.Uint128;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class DynActionTestService_changeName extends SncpActionServlet {
+
+    public DynActionTestService_changeName(
+            String resourceName,
+            Class resourceType,
+            Service service,
+            Uint128 serviceid,
+            Uint128 actionid,
+            final Method method) {
+        super(resourceName, resourceType, service, serviceid, actionid, method);
+    }
+
+    @Override
+    public void action(SncpRequest request, SncpResponse response) throws Throwable {
+        Convert convert = request.getConvert();
+        Reader in = request.getReader();
+        DynActionTestService_changeName_paramBean bean = convert.convertFrom(paramComposeType, in);
+        TestService serviceObj = (TestService) service();
+        CompletableFuture future = serviceObj.changeName(bean.arg1, bean.arg2, bean.arg3);
+        response.finishFuture(paramHandlerResultType, future);
+    }
+
+    public static class DynActionTestService_changeName_paramBean {
+
+        public DynActionTestService_changeName_paramBean() {}
+
+        public DynActionTestService_changeName_paramBean(Object[] params) {
+            this.arg1 = (TestBean) params[0];
+            this.arg2 = (String) params[1];
+            this.arg3 = (int) params[2];
+        }
+
+        @ConvertColumn(index = 1)
+        public TestBean arg1;
+
+        @ConvertColumn(index = 2)
+        public String arg2;
+
+        @ConvertColumn(index = 3)
+        public int arg3;
+    }
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_hello.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_hello.java
new file mode 100644
index 000000000..ed063fa2e
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_hello.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.lang.reflect.Method;
+import org.redkale.convert.Convert;
+import org.redkale.convert.Reader;
+import org.redkale.convert.Writer;
+import org.redkale.net.sncp.SncpRequest;
+import org.redkale.net.sncp.SncpResponse;
+import org.redkale.net.sncp.SncpServlet;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+import org.redkale.util.Uint128;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class DynActionTestService_hello extends SncpServlet.SncpActionServlet {
+
+    public DynActionTestService_hello(
+            String resourceName,
+            Class resourceType,
+            Service service,
+            Uint128 serviceid,
+            Uint128 actionid,
+            final Method method) {
+        super(resourceName, resourceType, service, serviceid, actionid, method);
+    }
+
+    @Override
+    public void action(SncpRequest request, SncpResponse response) throws Throwable {
+        Convert convert = request.getConvert();
+        Reader in = request.getReader();
+        TestBean bean = convert.convertFrom(paramComposeType, in);
+        TestService serviceObj = (TestService) service();
+        serviceObj.hello(bean);
+        response.finishVoid();
+    }
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java
new file mode 100644
index 000000000..8cd403f20
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_insert.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.lang.reflect.Method;
+import org.redkale.convert.Convert;
+import org.redkale.convert.ConvertColumn;
+import org.redkale.convert.Reader;
+import org.redkale.convert.Writer;
+import org.redkale.net.sncp.SncpRequest;
+import org.redkale.net.sncp.SncpResponse;
+import org.redkale.net.sncp.SncpServlet.SncpActionServlet;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+import org.redkale.util.Uint128;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class DynActionTestService_insert extends SncpActionServlet {
+
+    public DynActionTestService_insert(
+            String resourceName,
+            Class resourceType,
+            Service service,
+            Uint128 serviceid,
+            Uint128 actionid,
+            final Method method) {
+        super(resourceName, resourceType, service, serviceid, actionid, method);
+    }
+
+    @Override
+    public void action(SncpRequest request, SncpResponse response) throws Throwable {
+        Convert convert = request.getConvert();
+        Reader in = request.getReader();
+        DynActionTestService_insert_paramBean bean = convert.convertFrom(paramComposeType, in);
+        bean.arg0 = response.getParamAsyncHandler();
+        TestService serviceObj = (TestService) service();
+        serviceObj.insert(bean.arg0, bean.arg1, bean.arg2, bean.arg3);
+        response.finishVoid();
+    }
+
+    public static class DynActionTestService_insert_paramBean {
+
+        public DynActionTestService_insert_paramBean() {}
+
+        public DynActionTestService_insert_paramBean(Object[] params) {
+            this.arg0 = (BooleanHandler) params[0];
+            this.arg1 = (TestBean) params[1];
+            this.arg2 = (String) params[2];
+            this.arg3 = (int) params[3];
+        }
+
+        @ConvertColumn(index = 1)
+        public BooleanHandler arg0;
+
+        @ConvertColumn(index = 2)
+        public TestBean arg1;
+
+        @ConvertColumn(index = 3)
+        public String arg2;
+
+        @ConvertColumn(index = 4)
+        public int arg3;
+    }
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_update.java b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_update.java
new file mode 100644
index 000000000..2d18ef30d
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/DynActionTestService_update.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.lang.reflect.Method;
+import java.nio.channels.CompletionHandler;
+import org.redkale.convert.Convert;
+import org.redkale.convert.ConvertColumn;
+import org.redkale.convert.Reader;
+import org.redkale.convert.Writer;
+import org.redkale.net.sncp.SncpRequest;
+import org.redkale.net.sncp.SncpResponse;
+import org.redkale.net.sncp.SncpServlet.SncpActionServlet;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+import org.redkale.util.Uint128;
+
+/**
+ *
+ * @author zhangjx
+ */
+public class DynActionTestService_update extends SncpActionServlet {
+
+    public DynActionTestService_update(
+            String resourceName,
+            Class resourceType,
+            Service service,
+            Uint128 serviceid,
+            Uint128 actionid,
+            final Method method) {
+        super(resourceName, resourceType, service, serviceid, actionid, method);
+    }
+
+    @Override
+    public void action(SncpRequest request, SncpResponse response) throws Throwable {
+        Convert convert = request.getConvert();
+        Reader in = request.getReader();
+        DynActionTestService_update_paramBean bean = convert.convertFrom(paramComposeType, in);
+        bean.arg3 = response.getParamAsyncHandler();
+        TestService serviceObj = (TestService) service();
+        serviceObj.update(bean.arg1, bean.arg2, bean.arg3, bean.arg4, bean.arg5, bean.arg6);
+        response.finishVoid();
+    }
+
+    public static class DynActionTestService_update_paramBean {
+
+        public DynActionTestService_update_paramBean() {}
+
+        public DynActionTestService_update_paramBean(Object[] params) {
+            this.arg1 = (long) params[0];
+            this.arg2 = (short) params[1];
+            this.arg3 = (CompletionHandler) params[2];
+            this.arg4 = (TestBean) params[3];
+            this.arg5 = (String) params[4];
+            this.arg6 = (int) params[5];
+        }
+
+        @ConvertColumn(index = 1)
+        public long arg1;
+
+        @ConvertColumn(index = 2)
+        public short arg2;
+
+        @ConvertColumn(index = 3)
+        public CompletionHandler arg3;
+
+        @ConvertColumn(index = 4)
+        public TestBean arg4;
+
+        @ConvertColumn(index = 5)
+        public String arg5;
+
+        @ConvertColumn(index = 6)
+        public int arg6;
+    }
+ }
\ No newline at end of file
diff --git a/src/test/java/org/redkale/test/sncp/dyn/TestService.java b/src/test/java/org/redkale/test/sncp/dyn/TestService.java
new file mode 100644
index 000000000..9a4db0c52
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/TestService.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.nio.channels.CompletionHandler;
+import java.util.concurrent.CompletableFuture;
+import org.redkale.service.Service;
+import org.redkale.test.util.TestBean;
+
+/**
+ *
+ * @author zhangjx
+ */
+public interface TestService extends Service {
+
+    public boolean change(TestBean bean, String name, int id);
+
+    public void insert(BooleanHandler handler, TestBean bean, String name, int id);
+
+    public void update(
+            long show, short v2, CompletionHandler handler, TestBean bean, String name, int id);
+
+    public CompletableFuture changeName(TestBean bean, String name, int id);
+
+    public void hello(TestBean bean);
+}
diff --git a/src/test/java/org/redkale/test/sncp/dyn/TestServiceImpl.java b/src/test/java/org/redkale/test/sncp/dyn/TestServiceImpl.java
new file mode 100644
index 000000000..0d3dd3393
--- /dev/null
+++ b/src/test/java/org/redkale/test/sncp/dyn/TestServiceImpl.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2016-2116 Redkale
+ * All rights reserved.
+ */
+package org.redkale.test.sncp.dyn;
+
+import java.nio.channels.CompletionHandler;
+import java.util.concurrent.CompletableFuture;
+import org.redkale.annotation.ResourceType;
+import org.redkale.test.util.TestBean;
+
+/**
+ *
+ * @author zhangjx
+ */
+@ResourceType(TestService.class)
+public class TestServiceImpl implements TestService {
+
+    @Override
+    public boolean change(TestBean bean, String name, int id) {
+        return false;
+    }
+
+    @Override
+    public void insert(BooleanHandler handler, TestBean bean, String name, int id) {}
+
+    @Override
+    public void update(
+            long show, short v2, CompletionHandler handler, TestBean bean, String name, int id) {}
+
+    @Override
+    public CompletableFuture changeName(TestBean bean, String name, int id) {
+        return null;
+    }
+
+    @Override
+    public void hello(TestBean bean) {
+        System.out.println("hello: " + bean);
+    }
+}