From 7a5e58a112fc99b69fce0bcb7dbde09de1a50197 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Thu, 14 Dec 2017 10:42:24 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=A0=E6=8E=89AsyncHandler=EF=BC=8C=20?= =?UTF-8?q?=E9=87=87=E7=94=A8CompletionHandler=E4=BB=A3=E6=9B=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/org/redkale/convert/ConvertFactory.java | 1 - .../convert/ext/AsyncHandlerSimpledCoder.java | 36 ------- src/org/redkale/net/http/HttpContext.java | 13 +-- src/org/redkale/net/http/HttpResponse.java | 26 ++--- src/org/redkale/net/http/Rest.java | 30 +++--- .../redkale/net/http/WebSocketServlet.java | 3 +- src/org/redkale/net/sncp/Sncp.java | 11 ++- .../redkale/net/sncp/SncpAsyncHandler.java | 13 +-- src/org/redkale/net/sncp/SncpClient.java | 14 +-- src/org/redkale/net/sncp/SncpDynServlet.java | 25 ++--- src/org/redkale/service/Service.java | 4 +- src/org/redkale/util/AsyncHandler.java | 95 ------------------- src/org/redkale/util/Utility.java | 73 +++++++++++++- .../redkale/test/http/HttpResponseDesc.java | 14 +-- .../redkale/test/rest/HelloAsyncHandler.java | 4 +- test/org/redkale/test/rest/HelloService.java | 3 +- .../redkale/test/service/ABMainService.java | 6 +- test/org/redkale/test/service/BCService.java | 7 +- test/org/redkale/test/service/CService.java | 3 +- .../test/service/MyAsyncInnerHandler.java | 4 +- .../org/redkale/test/service/TestService.java | 3 +- .../test/sncp/SncpTestServiceImpl.java | 3 +- 22 files changed, 174 insertions(+), 217 deletions(-) delete mode 100644 src/org/redkale/convert/ext/AsyncHandlerSimpledCoder.java delete mode 100644 src/org/redkale/util/AsyncHandler.java diff --git a/src/org/redkale/convert/ConvertFactory.java b/src/org/redkale/convert/ConvertFactory.java index 52f6d75a7..52474a329 100644 --- a/src/org/redkale/convert/ConvertFactory.java +++ b/src/org/redkale/convert/ConvertFactory.java @@ -99,7 +99,6 @@ public abstract class ConvertFactory { this.register(Pattern.class, PatternSimpledCoder.instance); this.register(File.class, FileSimpledCoder.instance); this.register(CompletionHandler.class, CompletionHandlerSimpledCoder.instance); - this.register(AsyncHandler.class, AsyncHandlerSimpledCoder.instance); this.register(URL.class, URLSimpledCoder.instance); this.register(URI.class, URISimpledCoder.instance); //--------------------------------------------------------- diff --git a/src/org/redkale/convert/ext/AsyncHandlerSimpledCoder.java b/src/org/redkale/convert/ext/AsyncHandlerSimpledCoder.java deleted file mode 100644 index edadc177d..000000000 --- a/src/org/redkale/convert/ext/AsyncHandlerSimpledCoder.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.redkale.convert.ext; - -import org.redkale.convert.*; -import org.redkale.util.AsyncHandler; - -/** - * AsyncHandlerSimpledCoder 的SimpledCoder实现, 只输出null - * - *

- * 详情见: https://redkale.org - * - * @author zhangjx - * @param Reader输入的子类型 - * @param Writer输出的子类型 - */ -public final class AsyncHandlerSimpledCoder extends SimpledCoder { - - public static final AsyncHandlerSimpledCoder instance = new AsyncHandlerSimpledCoder(); - - @Override - public void convertTo(W out, AsyncHandler value) { - out.writeObjectNull(AsyncHandler.class); - } - - @Override - public AsyncHandler convertFrom(R in) { - in.readObjectB(AsyncHandler.class); - return null; - } - -} diff --git a/src/org/redkale/net/http/HttpContext.java b/src/org/redkale/net/http/HttpContext.java index 1d98fc15e..dc149dbd8 100644 --- a/src/org/redkale/net/http/HttpContext.java +++ b/src/org/redkale/net/http/HttpContext.java @@ -7,6 +7,7 @@ package org.redkale.net.http; import java.net.*; import java.nio.*; +import java.nio.channels.CompletionHandler; import java.nio.charset.*; import java.security.*; import java.util.concurrent.*; @@ -54,7 +55,7 @@ public class HttpContext extends Context { } @SuppressWarnings("unchecked") - protected Creator loadAsyncHandlerCreator(Class handlerClass) { + protected Creator loadAsyncHandlerCreator(Class handlerClass) { Creator creator = asyncHandlerCreators.get(handlerClass); if (creator == null) { creator = createAsyncHandlerCreator(handlerClass); @@ -64,14 +65,14 @@ public class HttpContext extends Context { } @SuppressWarnings("unchecked") - private Creator createAsyncHandlerCreator(Class handlerClass) { + private Creator createAsyncHandlerCreator(Class handlerClass) { //生成规则与SncpAsyncHandler.Factory 很类似 //------------------------------------------------------------- final boolean handlerinterface = handlerClass.isInterface(); final String handlerClassName = handlerClass.getName().replace('.', '/'); - final String handlerName = AsyncHandler.class.getName().replace('.', '/'); - final String handlerDesc = Type.getDescriptor(AsyncHandler.class); - final String newDynName = handlerClass.getName().replace('.', '/') + "_Dync" + AsyncHandler.class.getSimpleName() + "_" + (System.currentTimeMillis() % 10000); + final String handlerName = CompletionHandler.class.getName().replace('.', '/'); + final String handlerDesc = Type.getDescriptor(CompletionHandler.class); + final String newDynName = handlerClass.getName().replace('.', '/') + "_DyncAsyncHandler_" + (System.currentTimeMillis() % 10000); ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES); FieldVisitor fv; @@ -157,7 +158,7 @@ public class HttpContext extends Context { } cw.visitEnd(); byte[] bytes = cw.toByteArray(); - Class newHandlerClazz = (Class) new ClassLoader(handlerClass.getClassLoader()) { + Class newHandlerClazz = (Class) new ClassLoader(handlerClass.getClassLoader()) { public final Class loadClass(String name, byte[] b) { return defineClass(name, b, 0, b.length); } diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 3a922bbe7..7f7ffecb9 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -221,12 +221,12 @@ public class HttpResponse extends Response { } /** - * 创建AsyncHandler实例 + * 创建CompletionHandler实例 * - * @return AsyncHandler + * @return CompletionHandler */ - public AsyncHandler createAsyncHandler() { - return AsyncHandler.create((v, a) -> { + public CompletionHandler createAsyncHandler() { + return Utility.createAsyncHandler((v, a) -> { if (v instanceof org.redkale.service.RetResult) { finishJson((org.redkale.service.RetResult) v); } else if (v instanceof CharSequence) { @@ -241,18 +241,18 @@ public class HttpResponse extends Response { } /** - * 创建AsyncHandler子类的实例
+ * 创建CompletionHandler子类的实例
* - * 传入的AsyncHandler子类必须是public,且保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数。 + * 传入的CompletionHandler子类必须是public,且保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数。 * * @param 泛型 - * @param handlerClass AsyncHandler子类 + * @param handlerClass CompletionHandler子类 * - * @return AsyncHandler AsyncHandler + * @return CompletionHandler */ @SuppressWarnings("unchecked") - public H createAsyncHandler(Class handlerClass) { - if (handlerClass == null || handlerClass == AsyncHandler.class) return (H) createAsyncHandler(); + public H createAsyncHandler(Class handlerClass) { + if (handlerClass == null || handlerClass == CompletionHandler.class) return (H) createAsyncHandler(); return context.loadAsyncHandlerCreator(handlerClass).create(createAsyncHandler()); } @@ -650,7 +650,7 @@ public class HttpResponse extends Response { * @param attachment 异步回调参数 * @param handler 异步回调函数 */ - public void sendBody(ByteBuffer buffer, A attachment, AsyncHandler handler) { + public void sendBody(ByteBuffer buffer, A attachment, CompletionHandler handler) { if (!this.headsended) { if (this.contentLength < 0) this.contentLength = buffer == null ? 0 : buffer.remaining(); ByteBuffer headbuf = createHeader(); @@ -673,7 +673,7 @@ public class HttpResponse extends Response { * @param attachment 异步回调参数 * @param handler 异步回调函数 */ - public void sendBody(ByteBuffer[] buffers, A attachment, AsyncHandler handler) { + public void sendBody(ByteBuffer[] buffers, A attachment, CompletionHandler handler) { if (!this.headsended) { if (this.contentLength < 0) { int len = 0; @@ -1024,7 +1024,7 @@ public class HttpResponse extends Response { this.bufferHandler = bufferHandler; } - protected final class TransferFileHandler implements AsyncHandler { + protected final class TransferFileHandler implements CompletionHandler { private final File file; diff --git a/src/org/redkale/net/http/Rest.java b/src/org/redkale/net/http/Rest.java index e4b1d4a0c..d326599ba 100644 --- a/src/org/redkale/net/http/Rest.java +++ b/src/org/redkale/net/http/Rest.java @@ -10,6 +10,7 @@ import java.lang.annotation.*; import static java.lang.annotation.ElementType.*; import static java.lang.annotation.RetentionPolicy.RUNTIME; import java.lang.reflect.*; +import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.CompletableFuture; import javax.annotation.Resource; @@ -142,13 +143,20 @@ public final class Rest { return childFactory.getConvert(); } - static String getWebModuleName(Class serviceType) { + static String getWebModuleNameLowerCase(Class serviceType) { final RestService controller = serviceType.getAnnotation(RestService.class); if (controller == null) return serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase(); if (controller.ignore()) return null; return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", "").toLowerCase(); } + static String getWebModuleName(Class serviceType) { + final RestService controller = serviceType.getAnnotation(RestService.class); + if (controller == null) return serviceType.getSimpleName().replaceAll("Service.*$", ""); + if (controller.ignore()) return null; + return (!controller.name().isEmpty()) ? controller.name() : serviceType.getSimpleName().replaceAll("Service.*$", ""); + } + static boolean isRestDyn(HttpServlet servlet) { return servlet.getClass().getAnnotation(RestDyn.class) != null; } @@ -324,7 +332,7 @@ public final class Rest { mv.visitVarInsn(ALOAD, 0); pushInt(mv, rws.wsmaxbody()); mv.visitFieldInsn(PUTFIELD, newDynName, "wsmaxbody", "I"); - + mv.visitVarInsn(ALOAD, 0); mv.visitInsn(rws.single() ? ICONST_1 : ICONST_0); mv.visitFieldInsn(PUTFIELD, newDynName, "single", "Z"); @@ -332,7 +340,7 @@ public final class Rest { mv.visitVarInsn(ALOAD, 0); mv.visitInsn(rws.anyuser() ? ICONST_1 : ICONST_0); mv.visitFieldInsn(PUTFIELD, newDynName, "anyuser", "Z"); - + mv.visitInsn(RETURN); mv.visitMaxs(3, 1); mv.visitEnd(); @@ -607,7 +615,8 @@ public final class Rest { String newDynName = serviceTypeInternalName.substring(0, serviceTypeInternalName.lastIndexOf('/') + 1) + "_Dyn" + serviceType.getSimpleName().replaceAll("Service.*$", "") + "RestServlet"; //------------------------------------------------------------------------------ - final String defmodulename = getWebModuleName(serviceType); + final String defmodulename = getWebModuleNameLowerCase(serviceType); + final String bigmodulename = getWebModuleName(serviceType); final String catalog = controller == null ? "" : controller.catalog(); if (!checkName(catalog)) throw new RuntimeException(serviceType.getName() + " have illeal " + RestService.class.getSimpleName() + ".catalog, only 0-9 a-z A-Z _ cannot begin 0-9"); if (!checkName(defmodulename)) throw new RuntimeException(serviceType.getName() + " have illeal " + RestService.class.getSimpleName() + ".value, only 0-9 a-z A-Z _ cannot begin 0-9"); @@ -710,7 +719,7 @@ public final class Rest { if (ignore) continue; paramtypes.add(method.getGenericParameterTypes()); if (mappings.length == 0) { //没有Mapping,设置一个默认值 - MappingEntry entry = new MappingEntry(methodidex, null, defmodulename, method); + MappingEntry entry = new MappingEntry(methodidex, null, bigmodulename, method); if (entrys.contains(entry)) throw new RuntimeException(serviceType.getName() + " on " + method.getName() + " 's mapping(" + entry.name + ") is repeat"); entrys.add(entry); } else { @@ -723,7 +732,6 @@ public final class Rest { methodidex++; } if (entrys.isEmpty()) return null; //没有可HttpMapping的方法 - //将每个Service可转换的方法生成HttpServlet对应的HttpMapping方法 final Map> asmParamMap = MethodParamClassVisitor.getMethodParamNames(serviceType); final Map bodyTypes = new HashMap<>(); @@ -870,7 +878,7 @@ public final class Rest { if (ptype.isPrimitive() || ptype == String.class) n = "#"; } if (annhead == null && anncookie == null && annsid == null && annaddr == null && annbody == null && annfile == null - && !ptype.isPrimitive() && ptype != String.class && ptype != Flipper.class && !AsyncHandler.class.isAssignableFrom(ptype) + && !ptype.isPrimitive() && ptype != String.class && ptype != Flipper.class && !CompletionHandler.class.isAssignableFrom(ptype) && !ptype.getName().startsWith("java") && n.charAt(0) != '#' && !"&".equals(n)) { //判断Json对象是否包含@RestUploadFile Class loop = ptype; do { @@ -1007,17 +1015,17 @@ public final class Rest { paramMap.put("name", pname); paramMap.put("type", ptype.getName()); - if (AsyncHandler.class.isAssignableFrom(ptype)) { //HttpResponse.createAsyncHandler() or HttpResponse.createAsyncHandler(Class) - if (ptype == AsyncHandler.class) { + if (CompletionHandler.class.isAssignableFrom(ptype)) { //HttpResponse.createAsyncHandler() or HttpResponse.createAsyncHandler(Class) + if (ptype == CompletionHandler.class) { mv.visitVarInsn(ALOAD, 2); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "createAsyncHandler", "()Lorg/redkale/util/AsyncHandler;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "createAsyncHandler", "()Ljava/nio/channels/CompletionHandler;", false); mv.visitVarInsn(ASTORE, maxLocals); varInsns.add(new int[]{ALOAD, maxLocals}); } else { mv.visitVarInsn(ALOAD, 3); mv.visitVarInsn(ALOAD, 2); mv.visitLdcInsn(Type.getType(Type.getDescriptor(ptype))); - mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "createAsyncHandler", "(Ljava/lang/Class;)Lorg/redkale/util/AsyncHandler;", false); + mv.visitMethodInsn(INVOKEVIRTUAL, respInternalName, "createAsyncHandler", "(Ljava/lang/Class;)Ljava/nio/channels/CompletionHandler;", false); mv.visitTypeInsn(CHECKCAST, ptype.getName().replace('.', '/')); mv.visitVarInsn(ASTORE, maxLocals); varInsns.add(new int[]{ALOAD, maxLocals}); diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 745af4472..aa2cade38 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -9,6 +9,7 @@ import java.io.*; import java.lang.reflect.*; import java.net.*; import java.nio.*; +import java.nio.channels.CompletionHandler; import java.security.*; import java.util.*; import java.util.concurrent.CompletableFuture; @@ -192,7 +193,7 @@ public abstract class WebSocketServlet extends HttpServlet implements Resourcabl response.setHeader("Connection", "Upgrade"); response.addHeader("Upgrade", "websocket"); response.addHeader("Sec-WebSocket-Accept", Base64.getEncoder().encodeToString(bytes)); - response.sendBody((ByteBuffer) null, null, new AsyncHandler() { + response.sendBody((ByteBuffer) null, null, new CompletionHandler() { @Override public void completed(Integer result, Void attachment) { diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 4660df31f..3a0e94ad1 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -9,6 +9,7 @@ import java.lang.annotation.Annotation; import java.lang.reflect.*; import java.net.InetSocketAddress; import java.nio.ByteBuffer; +import java.nio.channels.CompletionHandler; import java.security.*; import java.util.*; import javax.annotation.Resource; @@ -138,12 +139,12 @@ public abstract class Sncp { } static void checkAsyncModifier(Class param, Method method) { - if (param == AsyncHandler.class) return; + if (param == CompletionHandler.class) return; if (Modifier.isFinal(param.getModifiers())) { - throw new RuntimeException("AsyncHandler Type Parameter on {" + method + "} cannot final modifier"); + throw new RuntimeException("CompletionHandler Type Parameter on {" + method + "} cannot final modifier"); } if (!Modifier.isPublic(param.getModifiers())) { - throw new RuntimeException("AsyncHandler Type Parameter on {" + method + "} must be public modifier"); + throw new RuntimeException("CompletionHandler Type Parameter on {" + method + "} must be public modifier"); } if (param.isInterface()) return; boolean constructorflag = false; @@ -388,8 +389,8 @@ public abstract class Sncp { int varindex = 0; boolean handlerFuncFlag = false; for (Class pt : paramtypes) { - if (AsyncHandler.class.isAssignableFrom(pt)) { - if (handlerFuncFlag) throw new RuntimeException(method + " have more than one AsyncHandler type parameter"); + if (CompletionHandler.class.isAssignableFrom(pt)) { + if (handlerFuncFlag) throw new RuntimeException(method + " have more than one CompletionHandler type parameter"); checkAsyncModifier(pt, method); handlerFuncFlag = true; } diff --git a/src/org/redkale/net/sncp/SncpAsyncHandler.java b/src/org/redkale/net/sncp/SncpAsyncHandler.java index 3abf70cac..f223ee14c 100644 --- a/src/org/redkale/net/sncp/SncpAsyncHandler.java +++ b/src/org/redkale/net/sncp/SncpAsyncHandler.java @@ -5,6 +5,7 @@ */ package org.redkale.net.sncp; +import java.nio.channels.CompletionHandler; import java.util.concurrent.CompletableFuture; import java.util.logging.Level; import jdk.internal.org.objectweb.asm.*; @@ -26,7 +27,7 @@ import org.redkale.util.*; * @param 结果对象的泛型 * @param 附件对象的泛型 */ -public interface SncpAsyncHandler extends AsyncHandler { +public interface SncpAsyncHandler extends CompletionHandler { public Object[] sncp_getParams(); @@ -42,9 +43,9 @@ public interface SncpAsyncHandler extends AsyncHandler { *

          *
          * 考虑点:
-         *      1、AsyncHandler子类是接口,且还有其他多个方法
-         *      2、AsyncHandler子类是类, 需要继承,且必须有空参数构造函数
-         *      3、AsyncHandler子类无论是接口还是类,都可能存在其他泛型
+         *      1、CompletionHandler子类是接口,且还有其他多个方法
+         *      2、CompletionHandler子类是类, 需要继承,且必须有空参数构造函数
+         *      3、CompletionHandler子类无论是接口还是类,都可能存在其他泛型
          *
          *  public class XXXAsyncHandler_DyncSncpAsyncHandler_4323 extends XXXAsyncHandler implements SncpAsyncHandler {
          *
@@ -91,11 +92,11 @@ public interface SncpAsyncHandler extends AsyncHandler {
          *
          * 
* - * @param handlerClass AsyncHandler类型或子类 + * @param handlerClass CompletionHandler类型或子类 * * @return Creator */ - public static Creator createCreator(Class handlerClass) { + public static Creator createCreator(Class handlerClass) { //------------------------------------------------------------- final boolean handlerinterface = handlerClass.isInterface(); final String handlerClassName = handlerClass.getName().replace('.', '/'); diff --git a/src/org/redkale/net/sncp/SncpClient.java b/src/org/redkale/net/sncp/SncpClient.java index a806d5c1e..2ebb20f06 100644 --- a/src/org/redkale/net/sncp/SncpClient.java +++ b/src/org/redkale/net/sncp/SncpClient.java @@ -293,7 +293,7 @@ public final class SncpClient { //只给远程模式调用的 public T remote(final int index, final Object... params) { final SncpAction action = actions[index]; - final AsyncHandler handlerFunc = action.handlerFuncParamIndex >= 0 ? (AsyncHandler) params[action.handlerFuncParamIndex] : null; + final CompletionHandler handlerFunc = action.handlerFuncParamIndex >= 0 ? (CompletionHandler) params[action.handlerFuncParamIndex] : null; if (action.handlerFuncParamIndex >= 0) params[action.handlerFuncParamIndex] = null; final BsonReader reader = bsonConvert.pollBsonReader(); CompletableFuture future = remote0(handlerFunc, remoteGroupTransport, null, action, params); @@ -339,7 +339,7 @@ public final class SncpClient { } } - private CompletableFuture remote0(final AsyncHandler handler, final Transport transport, final SocketAddress addr0, final SncpAction action, final Object... params) { + private CompletableFuture remote0(final CompletionHandler handler, final Transport transport, final SocketAddress addr0, final SncpAction action, final Object... params) { final Type[] myparamtypes = action.paramTypes; final Class[] myparamclass = action.paramClass; if (action.addressSourceParamIndex >= 0) params[action.addressSourceParamIndex] = this.clientAddress; @@ -347,7 +347,7 @@ public final class SncpClient { final BsonWriter writer = bsonConvert.pollBsonWriter(transport.getBufferSupplier()); // 将head写入 writer.writeTo(DEFAULT_HEADER); for (int i = 0; i < params.length; i++) { //params 可能包含: 3 个 boolean - bsonConvert.convertTo(writer, AsyncHandler.class.isAssignableFrom(myparamclass[i]) ? AsyncHandler.class : myparamtypes[i], params[i]); + bsonConvert.convertTo(writer, CompletionHandler.class.isAssignableFrom(myparamclass[i]) ? CompletionHandler.class : myparamtypes[i], params[i]); } final int reqBodyLength = writer.count() - HEADER_SIZE; //body总长度 final long seqid = System.nanoTime(); @@ -571,12 +571,12 @@ public final class SncpClient { if (anns.length > 0) { Class[] params = method.getParameterTypes(); for (int i = 0; i < params.length; i++) { - if (AsyncHandler.class.isAssignableFrom(params[i])) { + if (CompletionHandler.class.isAssignableFrom(params[i])) { if (boolReturnTypeFuture) { - throw new RuntimeException(method + " have both AsyncHandler and CompletableFuture"); + throw new RuntimeException(method + " have both CompletionHandler and CompletableFuture"); } if (handlerFuncIndex >= 0) { - throw new RuntimeException(method + " have more than one AsyncHandler type parameter"); + throw new RuntimeException(method + " have more than one CompletionHandler type parameter"); } Sncp.checkAsyncModifier(params[i], method); handlerFuncIndex = i; @@ -617,7 +617,7 @@ public final class SncpClient { this.handlerAttachParamIndex = handlerAttachIndex; this.paramAttrs = hasattr ? atts : null; if (this.handlerFuncParamIndex >= 0 && method.getReturnType() != void.class) { - throw new RuntimeException(method + " have AsyncHandler type parameter but return type is not void"); + throw new RuntimeException(method + " have CompletionHandler type parameter but return type is not void"); } } diff --git a/src/org/redkale/net/sncp/SncpDynServlet.java b/src/org/redkale/net/sncp/SncpDynServlet.java index 0c9b4e645..fe7cb0cf6 100644 --- a/src/org/redkale/net/sncp/SncpDynServlet.java +++ b/src/org/redkale/net/sncp/SncpDynServlet.java @@ -10,6 +10,7 @@ import java.io.*; import java.lang.annotation.*; import java.lang.reflect.*; import java.nio.*; +import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.*; @@ -118,7 +119,7 @@ public final class SncpDynServlet extends SncpServlet { SncpAsyncHandler handler = null; try { if (action.handlerFuncParamIndex >= 0) { - if (action.handlerFuncParamClass == AsyncHandler.class) { + if (action.handlerFuncParamClass == CompletionHandler.class) { handler = new DefaultSncpAsyncHandler(action, in, out, request, response); } else { Creator creator = action.handlerCreator; @@ -178,15 +179,15 @@ public final class SncpDynServlet extends SncpServlet { protected java.lang.reflect.Type[] paramTypes; //index=0表示返回参数的type, void的返回参数类型为null - protected int handlerFuncParamIndex = -1; //handlerFuncParamIndex>=0表示存在AsyncHandler参数 + protected int handlerFuncParamIndex = -1; //handlerFuncParamIndex>=0表示存在CompletionHandler参数 protected boolean boolReturnTypeFuture = false; // 返回结果类型是否为 CompletableFuture - protected Class handlerFuncParamClass; //AsyncHandler参数的类型 + protected Class handlerFuncParamClass; //CompletionHandler参数的类型 public abstract void action(final BsonReader in, final BsonWriter out, final SncpAsyncHandler handler) throws Throwable; - //只有同步方法才调用 (没有AsyncHandler、CompletableFuture) + //只有同步方法才调用 (没有CompletionHandler、CompletableFuture) public final void _callParameter(final BsonWriter out, final Object... params) { if (paramAttrs != null) { for (int i = 1; i < paramAttrs.length; i++) { @@ -207,10 +208,10 @@ public final class SncpDynServlet extends SncpServlet { * return false; * } * - * public void insert(AsyncHandler<Boolean, TestBean> handler, TestBean bean, String name, int id) { + * public void insert(CompletionHandler<Boolean, TestBean> handler, TestBean bean, String name, int id) { * } * - * public void update(long show, short v2, AsyncHandler<Boolean, TestBean> handler, TestBean bean, String name, int id) { + * public void update(long show, short v2, CompletionHandler<Boolean, TestBean> handler, TestBean bean, String name, int id) { * } * * public CompletableFuture<String> changeName(TestBean bean, String name, int id) { @@ -241,7 +242,7 @@ public final class SncpDynServlet extends SncpServlet { * @Override * public void action(BsonReader in, BsonWriter out, SncpAsyncHandler handler) throws Throwable { * SncpAsyncHandler arg0 = handler; - * convert.convertFrom(AsyncHandler.class, in); + * convert.convertFrom(CompletionHandler.class, in); * TestBean arg1 = convert.convertFrom(paramTypes[2], in); * String arg2 = convert.convertFrom(paramTypes[3], in); * int arg3 = convert.convertFrom(paramTypes[4], in); @@ -259,7 +260,7 @@ public final class SncpDynServlet extends SncpServlet { * long a1 = convert.convertFrom(paramTypes[1], in); * short a2 = convert.convertFrom(paramTypes[2], in); * SncpAsyncHandler a3 = handler; - * convert.convertFrom(AsyncHandler.class, in); + * convert.convertFrom(CompletionHandler.class, in); * TestBean arg1 = convert.convertFrom(paramTypes[4], in); * String arg2 = convert.convertFrom(paramTypes[5], in); * int arg3 = convert.convertFrom(paramTypes[6], in); @@ -353,12 +354,12 @@ public final class SncpDynServlet extends SncpServlet { final Class[] paramClasses = method.getParameterTypes(); int[][] codes = new int[paramClasses.length][2]; for (int i = 0; i < paramClasses.length; i++) { //反序列化方法的每个参数 - if (AsyncHandler.class.isAssignableFrom(paramClasses[i])) { + if (CompletionHandler.class.isAssignableFrom(paramClasses[i])) { if (boolReturnTypeFuture) { - throw new RuntimeException(method + " have both AsyncHandler and CompletableFuture"); + throw new RuntimeException(method + " have both CompletionHandler and CompletableFuture"); } if (handlerFuncIndex >= 0) { - throw new RuntimeException(method + " have more than one AsyncHandler type parameter"); + throw new RuntimeException(method + " have more than one CompletionHandler type parameter"); } Sncp.checkAsyncModifier(paramClasses[i], method); handlerFuncIndex = i; @@ -372,7 +373,7 @@ public final class SncpDynServlet extends SncpServlet { intconst++; mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, newDynName, "convert", Type.getDescriptor(BsonConvert.class)); - mv.visitLdcInsn(Type.getType(Type.getDescriptor(AsyncHandler.class))); + mv.visitLdcInsn(Type.getType(Type.getDescriptor(CompletionHandler.class))); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKEVIRTUAL, convertName, "convertFrom", convertFromDesc, false); mv.visitInsn(POP); diff --git a/src/org/redkale/service/Service.java b/src/org/redkale/service/Service.java index 87e4e43b2..19a235139 100644 --- a/src/org/redkale/service/Service.java +++ b/src/org/redkale/service/Service.java @@ -22,10 +22,10 @@ import org.redkale.util.*; *
  * 异步方法:
  * Service编写异步方法:
- *    1、异步方法有且仅有一个类型为AsyncHandler的参数, 返回类型必须是void。若参数类型为AsyncHandler子类,必须保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数。
+ *    1、异步方法有且仅有一个类型为CompletionHandler的参数, 返回类型必须是void。若参数类型为CompletionHandler子类,必须保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数。
  *    2、异步方法返回类型是CompletableFuture。
  * 例如:
- *      public void insertRecord(AsyncHandler<Integer, Record> handler, String name, @RpcAttachment Record record);
+ *      public void insertRecord(CompletionHandler<Integer, Record> handler, String name, @RpcAttachment Record record);
  *
  * 
* diff --git a/src/org/redkale/util/AsyncHandler.java b/src/org/redkale/util/AsyncHandler.java deleted file mode 100644 index 2cc9aa05e..000000000 --- a/src/org/redkale/util/AsyncHandler.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * To change this license header, choose License Headers in Project Properties. - * To change this template file, choose Tools | Templates - * and open the template in the editor. - */ -package org.redkale.util; - -import java.util.function.BiConsumer; -import java.nio.channels.CompletionHandler; -import java.util.function.*; - -/** - * 异步回调函数 - * - * - *

- * 详情见: https://redkale.org - * - * @author zhangjx - * @param 结果对象的泛型 - * @param 附件对象的泛型 - */ -public interface AsyncHandler extends CompletionHandler { - - /** - * 创建 AsyncHandler 对象 - * - * @param 结果对象的泛型 - * @param 附件对象的泛型 - * @param success 成功的回调函数 - * @param fail 失败的回调函数 - * - * @return AsyncHandler - */ - public static AsyncHandler create(final BiConsumer success, final BiConsumer fail) { - return new AsyncHandler() { - @Override - public void completed(V result, A attachment) { - if (success != null) success.accept(result, attachment); - } - - @Override - public void failed(Throwable exc, A attachment) { - if (fail != null) fail.accept(exc, attachment); - } - }; - } - - /** - * 创建没有返回结果的 AsyncHandler 对象 - * - * @param 附件对象的泛型 - * @param success 成功的回调函数 - * @param fail 失败的回调函数 - * - * @return AsyncHandler - */ - public static AsyncHandler create(final Consumer success, final BiConsumer fail) { - return new AsyncHandler() { - @Override - public void completed(Void result, A attachment) { - if (success != null) success.accept(attachment); - } - - @Override - public void failed(Throwable exc, A attachment) { - if (fail != null) fail.accept(exc, attachment); - } - }; - } - - /** - * 创建没有附件对象的 AsyncNoResultHandler 对象 - * - * @param 结果对象的泛型 - * @param success 成功的回调函数 - * @param fail 失败的回调函数 - * - * @return AsyncHandler - */ - public static AsyncHandler create(final Consumer success, final Consumer fail) { - return new AsyncHandler() { - @Override - public void completed(V result, Void attachment) { - if (success != null) success.accept(result); - } - - @Override - public void failed(Throwable exc, Void attachment) { - if (fail != null) fail.accept(exc); - } - }; - } - -} diff --git a/src/org/redkale/util/Utility.java b/src/org/redkale/util/Utility.java index 5d03d1e95..03a210c26 100644 --- a/src/org/redkale/util/Utility.java +++ b/src/org/redkale/util/Utility.java @@ -8,10 +8,11 @@ import java.io.*; import java.lang.reflect.*; import java.net.*; import java.nio.ByteBuffer; +import java.nio.channels.CompletionHandler; import java.nio.charset.*; import java.time.*; import java.util.*; -import java.util.function.Predicate; +import java.util.function.*; import java.util.zip.GZIPInputStream; import javax.net.ssl.*; @@ -458,6 +459,76 @@ public final class Utility { return back; } + /** + * 创建 CompletionHandler 对象 + * + * @param 结果对象的泛型 + * @param 附件对象的泛型 + * @param success 成功的回调函数 + * @param fail 失败的回调函数 + * + * @return CompletionHandler + */ + public static CompletionHandler createAsyncHandler(final BiConsumer success, final BiConsumer fail) { + return new CompletionHandler() { + @Override + public void completed(V result, A attachment) { + if (success != null) success.accept(result, attachment); + } + + @Override + public void failed(Throwable exc, A attachment) { + if (fail != null) fail.accept(exc, attachment); + } + }; + } + + /** + * 创建没有返回结果的 CompletionHandler 对象 + * + * @param 附件对象的泛型 + * @param success 成功的回调函数 + * @param fail 失败的回调函数 + * + * @return CompletionHandler + */ + public static CompletionHandler createAsyncHandler(final Consumer success, final BiConsumer fail) { + return new CompletionHandler() { + @Override + public void completed(Void result, A attachment) { + if (success != null) success.accept(attachment); + } + + @Override + public void failed(Throwable exc, A attachment) { + if (fail != null) fail.accept(exc, attachment); + } + }; + } + + /** + * 创建没有附件对象的 CompletionHandler 对象 + * + * @param 结果对象的泛型 + * @param success 成功的回调函数 + * @param fail 失败的回调函数 + * + * @return CompletionHandler + */ + public static CompletionHandler createAsyncHandler(final Consumer success, final Consumer fail) { + return new CompletionHandler() { + @Override + public void completed(V result, Void attachment) { + if (success != null) success.accept(result); + } + + @Override + public void failed(Throwable exc, Void attachment) { + if (fail != null) fail.accept(exc); + } + }; + } + /** * 获取格式为yyyy-MM-dd HH:mm:ss的当前时间 * diff --git a/test/org/redkale/test/http/HttpResponseDesc.java b/test/org/redkale/test/http/HttpResponseDesc.java index 93e4439d5..875772abb 100644 --- a/test/org/redkale/test/http/HttpResponseDesc.java +++ b/test/org/redkale/test/http/HttpResponseDesc.java @@ -9,12 +9,12 @@ import java.io.*; import java.lang.reflect.*; import java.net.*; import java.nio.*; +import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; import org.redkale.convert.json.*; import org.redkale.net.http.*; -import org.redkale.util.AsyncHandler; /** * @@ -28,11 +28,11 @@ public interface HttpResponseDesc { //增加Cookie值 public HttpResponse addCookie(Collection cookies); - //创建AsyncHandler实例,将非字符串对象以JSON格式输出,字符串以文本输出 - public AsyncHandler createAsyncHandler(); + //创建CompletionHandler实例,将非字符串对象以JSON格式输出,字符串以文本输出 + public CompletionHandler createAsyncHandler(); - //传入的AsyncHandler子类必须是public,且保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数 - public H createAsyncHandler(Class handlerClass); + //传入的CompletionHandler子类必须是public,且保证其子类可被继承且completed、failed可被重载且包含空参数的构造函数 + public H createAsyncHandler(Class handlerClass); //设置状态码 public void setStatus(int status); @@ -66,10 +66,10 @@ public interface HttpResponseDesc { public HttpResponse skipHeader(); //异步输出指定内容 - public void sendBody(ByteBuffer buffer, A attachment, AsyncHandler handler); + public void sendBody(ByteBuffer buffer, A attachment, CompletionHandler handler); //异步输出指定内容 - public void sendBody(ByteBuffer[] buffers, A attachment, AsyncHandler handler); + public void sendBody(ByteBuffer[] buffers, A attachment, CompletionHandler handler); //关闭HTTP连接,如果是keep-alive则不强制关闭 public void finish(); diff --git a/test/org/redkale/test/rest/HelloAsyncHandler.java b/test/org/redkale/test/rest/HelloAsyncHandler.java index 64c5b79d0..d3f9feff7 100644 --- a/test/org/redkale/test/rest/HelloAsyncHandler.java +++ b/test/org/redkale/test/rest/HelloAsyncHandler.java @@ -5,13 +5,13 @@ */ package org.redkale.test.rest; -import org.redkale.util.AsyncHandler; +import java.nio.channels.CompletionHandler; /** * * @author zhangjx */ -public class HelloAsyncHandler implements AsyncHandler { +public class HelloAsyncHandler implements CompletionHandler { @Override public void completed(Object result, Object attachment) { diff --git a/test/org/redkale/test/rest/HelloService.java b/test/org/redkale/test/rest/HelloService.java index 0722e6843..6183bf4f3 100644 --- a/test/org/redkale/test/rest/HelloService.java +++ b/test/org/redkale/test/rest/HelloService.java @@ -1,5 +1,6 @@ package org.redkale.test.rest; +import java.nio.channels.CompletionHandler; import java.util.*; import java.util.concurrent.CompletableFuture; import javax.annotation.Resource; @@ -96,7 +97,7 @@ public class HelloService implements Service { //异步查询单个 @RestMapping(name = "asyncfind2") - public void asyncFindHello(AsyncHandler hander, @RestParam(name = "#") int id) { //通过 /pipes/hello/find/1234、/pipes/hello/jsfind/1234 查询对象 + public void asyncFindHello(CompletionHandler hander, @RestParam(name = "#") int id) { //通过 /pipes/hello/find/1234、/pipes/hello/jsfind/1234 查询对象 if (source != null) source.findAsync(HelloEntity.class, id); System.out.println("-----------进入asyncfind2--------" + hander); hander.completed(new HelloEntity(id), id); diff --git a/test/org/redkale/test/service/ABMainService.java b/test/org/redkale/test/service/ABMainService.java index c573c9e8d..be7c3911a 100644 --- a/test/org/redkale/test/service/ABMainService.java +++ b/test/org/redkale/test/service/ABMainService.java @@ -8,7 +8,7 @@ package org.redkale.test.service; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; -import java.nio.channels.AsynchronousChannelGroup; +import java.nio.channels.*; import java.util.concurrent.*; import java.util.concurrent.atomic.*; import java.util.logging.*; @@ -165,8 +165,8 @@ public class ABMainService implements Service { } @RestMapping(name = "asyncabtime") - public void abCurrentTime(final AsyncHandler handler, @RestParam(name = "#") final String name) { - bcService.bcCurrentTime(AsyncHandler.create((v, a) -> { + public void abCurrentTime(final CompletionHandler handler, @RestParam(name = "#") final String name) { + bcService.bcCurrentTime(Utility.createAsyncHandler((v, a) -> { System.out.println("执行了 ABMainService.abCurrentTime----异步方法"); String rs = "异步abCurrentTime: " + v; if (handler != null) handler.completed(rs, a); diff --git a/test/org/redkale/test/service/BCService.java b/test/org/redkale/test/service/BCService.java index 5bf1368f9..dd0d51df2 100644 --- a/test/org/redkale/test/service/BCService.java +++ b/test/org/redkale/test/service/BCService.java @@ -5,9 +5,10 @@ */ package org.redkale.test.service; +import java.nio.channels.CompletionHandler; import javax.annotation.Resource; import org.redkale.service.*; -import org.redkale.util.AsyncHandler; +import org.redkale.util.*; /** * @@ -24,8 +25,8 @@ public class BCService implements Service { return rs; } - public void bcCurrentTime(final AsyncHandler handler, final String name) { - cService.ccCurrentTime(AsyncHandler.create((v, a) -> { + public void bcCurrentTime(final CompletionHandler handler, final String name) { + cService.ccCurrentTime(Utility.createAsyncHandler((v, a) -> { System.out.println("执行了 BCService.bcCurrentTime----异步方法"); String rs = "异步bcCurrentTime: " + (v == null ? null : v.getResult()); if (handler != null) handler.completed(rs, null); diff --git a/test/org/redkale/test/service/CService.java b/test/org/redkale/test/service/CService.java index 44b06b068..0be0455cd 100644 --- a/test/org/redkale/test/service/CService.java +++ b/test/org/redkale/test/service/CService.java @@ -5,6 +5,7 @@ */ package org.redkale.test.service; +import java.nio.channels.CompletionHandler; import org.redkale.service.*; import org.redkale.util.*; @@ -20,7 +21,7 @@ public class CService implements Service { return new RetResult(rs); } - public void ccCurrentTime(final AsyncHandler, Void> handler, final String name) { + public void ccCurrentTime(final CompletionHandler, Void> handler, final String name) { String rs = "异步ccCurrentTime: " + name + ": " + Utility.formatTime(System.currentTimeMillis()); System.out.println("执行了 CService.ccCurrentTime----异步方法"); if (handler != null) handler.completed(new RetResult(rs), null); diff --git a/test/org/redkale/test/service/MyAsyncInnerHandler.java b/test/org/redkale/test/service/MyAsyncInnerHandler.java index e83460c41..671037220 100644 --- a/test/org/redkale/test/service/MyAsyncInnerHandler.java +++ b/test/org/redkale/test/service/MyAsyncInnerHandler.java @@ -5,13 +5,13 @@ */ package org.redkale.test.service; -import org.redkale.util.AsyncHandler; +import java.nio.channels.CompletionHandler; /** * * @author zhangjx */ -public abstract class MyAsyncInnerHandler implements AsyncHandler { +public abstract class MyAsyncInnerHandler implements CompletionHandler { protected abstract int id2(); diff --git a/test/org/redkale/test/service/TestService.java b/test/org/redkale/test/service/TestService.java index 7e0be63b7..58c89939a 100644 --- a/test/org/redkale/test/service/TestService.java +++ b/test/org/redkale/test/service/TestService.java @@ -5,6 +5,7 @@ */ package org.redkale.test.service; +import java.nio.channels.CompletionHandler; import org.redkale.net.sncp.*; import org.redkale.service.Service; import org.redkale.util.*; @@ -19,7 +20,7 @@ public class TestService implements Service { // return false; // } - public void change(AsyncHandler handler, TestBean bean, String name, int id) { + public void change(CompletionHandler handler, TestBean bean, String name, int id) { } diff --git a/test/org/redkale/test/sncp/SncpTestServiceImpl.java b/test/org/redkale/test/sncp/SncpTestServiceImpl.java index 1ab690c3e..fbc4127d1 100644 --- a/test/org/redkale/test/sncp/SncpTestServiceImpl.java +++ b/test/org/redkale/test/sncp/SncpTestServiceImpl.java @@ -7,6 +7,7 @@ package org.redkale.test.sncp; import java.lang.reflect.Method; import java.net.InetSocketAddress; +import java.nio.channels.CompletionHandler; import java.util.concurrent.*; import org.redkale.net.TransportFactory; import org.redkale.net.sncp.*; @@ -97,7 +98,7 @@ public class SncpTestServiceImpl implements SncpTestIService { return "result: " + bean; } - public void queryResult(AsyncHandler handler, @RpcAttachment SncpTestBean bean) { + public void queryResult(CompletionHandler handler, @RpcAttachment SncpTestBean bean) { System.out.println(Thread.currentThread().getName() + " handler 运行了queryResult方法"); if (handler != null) handler.completed("result: " + bean, bean); }