From b1d810188cdc08a5fadcf931a540945412ab45f6 Mon Sep 17 00:00:00 2001 From: Redkale <22250530@qq.com> Date: Fri, 17 Mar 2017 14:54:00 +0800 Subject: [PATCH] --- src/org/redkale/net/http/HttpResponse.java | 25 +++++++++++++++++-- .../redkale/net/http/WebSocketServlet.java | 3 +-- .../redkale/service/CacheSourceService.java | 15 +++++++---- src/org/redkale/source/CacheSource.java | 13 +++++----- .../redkale/test/http/HttpResponseDesc.java | 9 ++++--- 5 files changed, 47 insertions(+), 18 deletions(-) diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index 7ba7b715c..8d4e1d4c6 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -14,6 +14,7 @@ import java.nio.file.*; import java.text.*; import java.util.*; import java.util.concurrent.atomic.AtomicLong; +import java.util.logging.Level; import org.redkale.convert.json.JsonConvert; import org.redkale.net.*; import org.redkale.util.AnyValue.DefaultAnyValue; @@ -200,6 +201,26 @@ public class HttpResponse extends Response { return this; } + /** + * 创建AsyncHandler实例,将非字符串对象以JSON格式输出,字符串以文本输出 + * + * @return AsyncHandler + */ + public AsyncHandler createAsyncHandler() { + return AsyncHandler.create((v, a) -> { + if (v instanceof org.redkale.service.RetResult) { + finishJson((org.redkale.service.RetResult) v); + } else if (v instanceof CharSequence) { + finish(String.valueOf(v)); + } else { + finishJson(v); + } + }, (t, a) -> { + request.getContext().getLogger().log(Level.WARNING, "Servlet occur, forece to close channel. request = " + request, t); + finish(500, null); + }); + } + /** * 将对象以JSON格式输出 * @@ -457,7 +478,7 @@ public class HttpResponse extends Response { * @param attachment 异步回调参数 * @param handler 异步回调函数 */ - public void sendBody(ByteBuffer buffer, A attachment, CompletionHandler handler) { + public void sendBody(ByteBuffer buffer, A attachment, AsyncHandler handler) { if (!this.headsended) { if (this.contentLength < 0) this.contentLength = buffer == null ? 0 : buffer.remaining(); ByteBuffer headbuf = createHeader(); @@ -796,7 +817,7 @@ public class HttpResponse extends Response { this.bufferHandler = bufferHandler; } - protected final class TransferFileHandler implements CompletionHandler { + protected final class TransferFileHandler implements AsyncHandler { private final AsynchronousFileChannel filechannel; diff --git a/src/org/redkale/net/http/WebSocketServlet.java b/src/org/redkale/net/http/WebSocketServlet.java index 22b11b630..0f05e44e8 100644 --- a/src/org/redkale/net/http/WebSocketServlet.java +++ b/src/org/redkale/net/http/WebSocketServlet.java @@ -8,7 +8,6 @@ package org.redkale.net.http; import java.io.*; import java.net.*; import java.nio.*; -import java.nio.channels.*; import java.security.*; import java.util.*; import java.util.logging.*; @@ -128,7 +127,7 @@ public abstract class WebSocketServlet extends HttpServlet { response.setHeader("Connection", "Upgrade"); response.addHeader("Upgrade", "websocket"); response.addHeader("Sec-WebSocket-Accept", key); - response.sendBody((ByteBuffer) null, null, new CompletionHandler() { + response.sendBody((ByteBuffer) null, null, new AsyncHandler() { @Override public void completed(Integer result, Void attachment) { diff --git a/src/org/redkale/service/CacheSourceService.java b/src/org/redkale/service/CacheSourceService.java index ff9856534..6f71789cd 100644 --- a/src/org/redkale/service/CacheSourceService.java +++ b/src/org/redkale/service/CacheSourceService.java @@ -192,9 +192,10 @@ public class CacheSourceService implem } @Override - public void exists(final AsyncHandler handler, @RpcAttachment final K key) { + public boolean exists(final AsyncHandler handler, @RpcAttachment final K key) { boolean rs = exists(key); if (handler != null) handler.completed(rs, key); + return rs; } @Override @@ -208,9 +209,10 @@ public class CacheSourceService implem } @Override - public void get(final AsyncHandler handler, @RpcAttachment final K key) { + public V get(final AsyncHandler handler, @RpcAttachment final K key) { V rs = get(key); if (handler != null) handler.completed(rs, key); + return rs; } @Override @@ -227,9 +229,10 @@ public class CacheSourceService implem } @Override - public void getAndRefresh(final AsyncHandler handler, @RpcAttachment final K key, final int expireSeconds) { + public V getAndRefresh(final AsyncHandler handler, @RpcAttachment final K key, final int expireSeconds) { V rs = getAndRefresh(key, expireSeconds); if (handler != null) handler.completed(rs, key); + return rs; } @Override @@ -324,9 +327,10 @@ public class CacheSourceService implem } @Override - public void getCollection(final AsyncHandler, K> handler, @RpcAttachment final K key) { + public Collection getCollection(final AsyncHandler, K> handler, @RpcAttachment final K key) { Collection rs = getCollection(key); if (handler != null) handler.completed(rs, key); + return rs; } @Override @@ -335,9 +339,10 @@ public class CacheSourceService implem } @Override - public void getCollectionAndRefresh(final AsyncHandler, K> handler, @RpcAttachment final K key, final int expireSeconds) { + public Collection getCollectionAndRefresh(final AsyncHandler, K> handler, @RpcAttachment final K key, final int expireSeconds) { Collection rs = getCollectionAndRefresh(key, expireSeconds); if (handler != null) handler.completed(rs, key); + return rs; } @Override diff --git a/src/org/redkale/source/CacheSource.java b/src/org/redkale/source/CacheSource.java index 9637b47ae..6ce4c3a05 100644 --- a/src/org/redkale/source/CacheSource.java +++ b/src/org/redkale/source/CacheSource.java @@ -53,11 +53,11 @@ public interface CacheSource { public void removeSetItem(final K key, final V value); //----------------------异步版--------------------------------- - public void exists(final AsyncHandler handler, final K key); + public boolean exists(final AsyncHandler handler, final K key); - public void get(final AsyncHandler handler, final K key); + public V get(final AsyncHandler handler, final K key); - public void getAndRefresh(final AsyncHandler handler, final K key, final int expireSeconds); + public V getAndRefresh(final AsyncHandler handler, final K key, final int expireSeconds); public void refresh(final AsyncHandler handler, final K key, final int expireSeconds); @@ -69,9 +69,9 @@ public interface CacheSource { public void remove(final AsyncHandler handler, final K key); - public void getCollection(final AsyncHandler, K> handler, final K key); + public Collection getCollection(final AsyncHandler, K> handler, final K key); - public void getCollectionAndRefresh(final AsyncHandler, K> handler, final K key, final int expireSeconds); + public Collection getCollectionAndRefresh(final AsyncHandler, K> handler, final K key, final int expireSeconds); public void appendListItem(final AsyncHandler handler, final K key, final V value); @@ -81,7 +81,8 @@ public interface CacheSource { public void removeSetItem(final AsyncHandler handler, final K key, final V value); - default void isOpen(final AsyncHandler handler) { + default boolean isOpen(final AsyncHandler handler) { if (handler != null) handler.completed(Boolean.TRUE, null); + return true; } } diff --git a/test/org/redkale/test/http/HttpResponseDesc.java b/test/org/redkale/test/http/HttpResponseDesc.java index 49de0cf5a..6c481ebcf 100644 --- a/test/org/redkale/test/http/HttpResponseDesc.java +++ b/test/org/redkale/test/http/HttpResponseDesc.java @@ -9,11 +9,11 @@ import java.io.*; import java.lang.reflect.*; import java.net.*; import java.nio.*; -import java.nio.channels.*; import java.util.*; import java.util.function.BiConsumer; import org.redkale.convert.json.*; import org.redkale.net.http.*; +import org.redkale.util.AsyncHandler; /** * @@ -59,8 +59,11 @@ public interface HttpResponseDesc { public HttpResponse skipHeader(); //异步输出指定内容 - public void sendBody(ByteBuffer buffer, A attachment, CompletionHandler handler); - + public void sendBody(ByteBuffer buffer, A attachment, AsyncHandler handler); + + //创建AsyncHandler实例,将非字符串对象以JSON格式输出,字符串以文本输出 + public AsyncHandler createAsyncHandler(); + //关闭HTTP连接,如果是keep-alive则不强制关闭 public void finish();