From a1501af7a7c269f7a8d6bf7a9e85b2fa9338592c Mon Sep 17 00:00:00 2001 From: Redkale <8730487+redkale@users.noreply.github.com> Date: Sat, 30 May 2020 19:55:07 +0800 Subject: [PATCH] --- src/org/redkale/cluster/ClusterAgent.java | 2 + src/org/redkale/mq/HttpMessageRequest.java | 3 +- src/org/redkale/mq/HttpMessageResponse.java | 2 + src/org/redkale/mq/HttpResultCoder.java | 130 ++++++++++++++++++ .../redkale/mq/HttpSimpleRequestCoder.java | 2 + src/org/redkale/mq/MessageAgent.java | 2 + src/org/redkale/mq/MessageCoder.java | 3 + src/org/redkale/mq/MessageConsumer.java | 3 + src/org/redkale/mq/MessageProcessor.java | 2 + src/org/redkale/mq/MessageProducer.java | 2 + src/org/redkale/mq/MessageRecord.java | 2 + src/org/redkale/mq/MessageRecordCoder.java | 2 + src/org/redkale/mq/MessageResponse.java | 2 + src/org/redkale/mq/SncpMessageRequest.java | 2 + src/org/redkale/mq/SncpMessageResponse.java | 2 + src/org/redkale/net/http/HttpResponse.java | 4 +- src/org/redkale/net/http/HttpResult.java | 34 ++--- .../redkale/net/http/HttpSimpleRequest.java | 2 + src/org/redkale/net/sncp/Sncp.java | 6 + src/org/redkale/net/sncp/SncpClient.java | 7 +- .../service/RpcCallArrayAttribute.java | 2 + src/org/redkale/service/RpcCallAttribute.java | 2 + src/org/redkale/util/Version.java | 29 ++++ 23 files changed, 219 insertions(+), 28 deletions(-) create mode 100644 src/org/redkale/mq/HttpResultCoder.java create mode 100644 src/org/redkale/util/Version.java diff --git a/src/org/redkale/cluster/ClusterAgent.java b/src/org/redkale/cluster/ClusterAgent.java index f7b9388c6..3b06d6162 100644 --- a/src/org/redkale/cluster/ClusterAgent.java +++ b/src/org/redkale/cluster/ClusterAgent.java @@ -24,6 +24,8 @@ import org.redkale.util.*; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public abstract class ClusterAgent { diff --git a/src/org/redkale/mq/HttpMessageRequest.java b/src/org/redkale/mq/HttpMessageRequest.java index 68189e5b4..7b036e291 100644 --- a/src/org/redkale/mq/HttpMessageRequest.java +++ b/src/org/redkale/mq/HttpMessageRequest.java @@ -8,12 +8,13 @@ package org.redkale.mq; import org.redkale.net.http.*; /** - * * *

* 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class HttpMessageRequest extends HttpRequest { diff --git a/src/org/redkale/mq/HttpMessageResponse.java b/src/org/redkale/mq/HttpMessageResponse.java index ce035553e..133f8ba27 100644 --- a/src/org/redkale/mq/HttpMessageResponse.java +++ b/src/org/redkale/mq/HttpMessageResponse.java @@ -19,6 +19,8 @@ import org.redkale.util.ObjectPool; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class HttpMessageResponse extends HttpResponse { diff --git a/src/org/redkale/mq/HttpResultCoder.java b/src/org/redkale/mq/HttpResultCoder.java new file mode 100644 index 000000000..0ea323f14 --- /dev/null +++ b/src/org/redkale/mq/HttpResultCoder.java @@ -0,0 +1,130 @@ +/* + * 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.mq; + +import java.net.HttpCookie; +import java.nio.ByteBuffer; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import org.redkale.convert.*; +import org.redkale.convert.json.JsonConvert; +import static org.redkale.mq.MessageCoder.*; +import org.redkale.net.http.HttpResult; +import org.redkale.util.Utility; + +/** + * HttpResult的MessageCoder实现 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * + * @since 2.1.0 + */ +public class HttpResultCoder implements MessageCoder { + + private static final HttpResultCoder instance = new HttpResultCoder(); + + public static HttpResultCoder getInstance() { + return instance; + } + + @Override + public byte[] encode(HttpResult data) { + if (data == null) return null; + byte[] contentType = MessageCoder.getBytes(data.getContentType()); + byte[] headers = MessageCoder.getBytes(data.getHeaders()); + byte[] cookies = getBytes(data.getCookies()); + byte[] content; + if (data.getResult() == null) { + content = new byte[0]; //"" + } else if (data.getResult() instanceof CharSequence) { + content = MessageCoder.getBytes(data.getResult().toString()); + } else { + Convert cc = data.convert(); + if (cc == null || !(cc instanceof TextConvert)) cc = JsonConvert.root(); + content = cc.convertToBytes(data.getResult()); + } + int count = 4 + 2 + contentType.length + headers.length + cookies.length + 4 + (content == null ? 0 : content.length); + final byte[] bs = new byte[count]; + ByteBuffer buffer = ByteBuffer.wrap(bs); + buffer.putInt(data.getStatus()); + buffer.putChar((char) contentType.length); + if (contentType.length > 0) buffer.put(contentType); + buffer.put(headers); + buffer.put(cookies); + if (content == null || content.length == 0) { + buffer.putInt(0); + } else { + buffer.putInt(content.length); + buffer.put(content); + } + return bs; + } + + @Override + public HttpResult decode(byte[] data) { + if (data == null) return null; + ByteBuffer buffer = ByteBuffer.wrap(data); + HttpResult result = new HttpResult(); + result.setStatus(buffer.getInt()); + result.setContentType(MessageCoder.getShortString(buffer)); + result.setHeaders(MessageCoder.getMap(buffer)); + result.setCookies(getCookieList(buffer)); + int len = buffer.getInt(); + if (len > 0) { + byte[] bs = new byte[len]; + buffer.get(bs); + result.setResult(bs); + } + return result; + } + + public static byte[] getBytes(final List list) { + if (list == null || list.isEmpty()) return new byte[2]; + final AtomicInteger len = new AtomicInteger(2); + list.forEach(cookie -> { + len.addAndGet(2 + (cookie.getName() == null ? 0 : Utility.encodeUTF8Length(cookie.getName()))); + len.addAndGet(2 + (cookie.getValue() == null ? 0 : Utility.encodeUTF8Length(cookie.getValue()))); + len.addAndGet(2 + (cookie.getDomain() == null ? 0 : Utility.encodeUTF8Length(cookie.getDomain()))); + len.addAndGet(2 + (cookie.getPath() == null ? 0 : Utility.encodeUTF8Length(cookie.getPath()))); + len.addAndGet(2 + (cookie.getPortlist() == null ? 0 : Utility.encodeUTF8Length(cookie.getPortlist()))); + len.addAndGet(4 + 1 + 1); //maxage Secure HttpOnly + }); + final byte[] bs = new byte[len.get()]; + final ByteBuffer buffer = ByteBuffer.wrap(bs); + buffer.putChar((char) list.size()); + list.forEach(cookie -> { + putShortString(buffer, cookie.getName()); + putShortString(buffer, cookie.getValue()); + putShortString(buffer, cookie.getDomain()); + putShortString(buffer, cookie.getPath()); + putShortString(buffer, cookie.getPortlist()); + buffer.putLong(cookie.getMaxAge()); + buffer.put(cookie.getSecure() ? (byte) 1 : (byte) 0); + buffer.put(cookie.isHttpOnly() ? (byte) 1 : (byte) 0); + }); + return bs; + } + + public static List getCookieList(ByteBuffer buffer) { + int len = buffer.getChar(); + if (len == 0) return null; + final List list = new ArrayList<>(len); + for (int i = 0; i < len; i++) { + HttpCookie cookie = new HttpCookie(getShortString(buffer), getShortString(buffer)); + cookie.setDomain(getShortString(buffer)); + cookie.setPath(getShortString(buffer)); + cookie.setPortlist(getShortString(buffer)); + cookie.setMaxAge(buffer.getLong()); + cookie.setSecure(buffer.get() == 1); + cookie.setHttpOnly(buffer.get() == 1); + list.add(cookie); + } + return list; + } +} diff --git a/src/org/redkale/mq/HttpSimpleRequestCoder.java b/src/org/redkale/mq/HttpSimpleRequestCoder.java index 2b0d94245..d792bb6ee 100644 --- a/src/org/redkale/mq/HttpSimpleRequestCoder.java +++ b/src/org/redkale/mq/HttpSimpleRequestCoder.java @@ -16,6 +16,8 @@ import org.redkale.net.http.HttpSimpleRequest; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class HttpSimpleRequestCoder implements MessageCoder { diff --git a/src/org/redkale/mq/MessageAgent.java b/src/org/redkale/mq/MessageAgent.java index 95718bdef..49dd91735 100644 --- a/src/org/redkale/mq/MessageAgent.java +++ b/src/org/redkale/mq/MessageAgent.java @@ -21,6 +21,8 @@ import org.redkale.util.*; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public abstract class MessageAgent { diff --git a/src/org/redkale/mq/MessageCoder.java b/src/org/redkale/mq/MessageCoder.java index 58584a172..ce9686fba 100644 --- a/src/org/redkale/mq/MessageCoder.java +++ b/src/org/redkale/mq/MessageCoder.java @@ -19,6 +19,9 @@ import org.redkale.util.Utility; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 + * * @param 泛型 */ public interface MessageCoder { diff --git a/src/org/redkale/mq/MessageConsumer.java b/src/org/redkale/mq/MessageConsumer.java index bf4b19f75..b98ef2936 100644 --- a/src/org/redkale/mq/MessageConsumer.java +++ b/src/org/redkale/mq/MessageConsumer.java @@ -14,7 +14,10 @@ import java.util.logging.Logger; *

* 详情见: https://redkale.org * + * * @author zhangjx + * + * @since 2.1.0 */ public abstract class MessageConsumer extends Thread { diff --git a/src/org/redkale/mq/MessageProcessor.java b/src/org/redkale/mq/MessageProcessor.java index eea0f473f..31fa1e700 100644 --- a/src/org/redkale/mq/MessageProcessor.java +++ b/src/org/redkale/mq/MessageProcessor.java @@ -11,6 +11,8 @@ package org.redkale.mq; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public interface MessageProcessor { diff --git a/src/org/redkale/mq/MessageProducer.java b/src/org/redkale/mq/MessageProducer.java index 8d6e6ef6b..dbfb780d1 100644 --- a/src/org/redkale/mq/MessageProducer.java +++ b/src/org/redkale/mq/MessageProducer.java @@ -14,6 +14,8 @@ import java.util.logging.Logger; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public abstract class MessageProducer extends Thread { diff --git a/src/org/redkale/mq/MessageRecord.java b/src/org/redkale/mq/MessageRecord.java index 094eccea4..58f34fb15 100644 --- a/src/org/redkale/mq/MessageRecord.java +++ b/src/org/redkale/mq/MessageRecord.java @@ -18,6 +18,8 @@ import org.redkale.util.Comment; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class MessageRecord implements Serializable { diff --git a/src/org/redkale/mq/MessageRecordCoder.java b/src/org/redkale/mq/MessageRecordCoder.java index 11f391007..45054eff4 100644 --- a/src/org/redkale/mq/MessageRecordCoder.java +++ b/src/org/redkale/mq/MessageRecordCoder.java @@ -15,6 +15,8 @@ import org.redkale.convert.ConvertType; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class MessageRecordCoder implements MessageCoder { diff --git a/src/org/redkale/mq/MessageResponse.java b/src/org/redkale/mq/MessageResponse.java index 237080320..0dab904b3 100644 --- a/src/org/redkale/mq/MessageResponse.java +++ b/src/org/redkale/mq/MessageResponse.java @@ -11,6 +11,8 @@ package org.redkale.mq; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public interface MessageResponse { diff --git a/src/org/redkale/mq/SncpMessageRequest.java b/src/org/redkale/mq/SncpMessageRequest.java index 6ced5225b..b86265a3a 100644 --- a/src/org/redkale/mq/SncpMessageRequest.java +++ b/src/org/redkale/mq/SncpMessageRequest.java @@ -14,6 +14,8 @@ import org.redkale.net.sncp.*; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class SncpMessageRequest extends SncpRequest { diff --git a/src/org/redkale/mq/SncpMessageResponse.java b/src/org/redkale/mq/SncpMessageResponse.java index 163226a93..8c568d7e6 100644 --- a/src/org/redkale/mq/SncpMessageResponse.java +++ b/src/org/redkale/mq/SncpMessageResponse.java @@ -19,6 +19,8 @@ import org.redkale.util.ObjectPool; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class SncpMessageResponse extends SncpResponse { diff --git a/src/org/redkale/net/http/HttpResponse.java b/src/org/redkale/net/http/HttpResponse.java index b502d3144..639d3a6bd 100644 --- a/src/org/redkale/net/http/HttpResponse.java +++ b/src/org/redkale/net/http/HttpResponse.java @@ -1013,7 +1013,7 @@ public class HttpResponse extends Response { if (defaultCookie.getDomain() != null && cookie.getDomain() == null) cookie.setDomain(defaultCookie.getDomain()); if (defaultCookie.getPath() != null && cookie.getPath() == null) cookie.setPath(defaultCookie.getPath()); } - buffer.put(("Set-Cookie: " + genString(cookie) + "\r\n").getBytes()); + buffer.put(("Set-Cookie: " + cookieString(cookie) + "\r\n").getBytes()); } } buffer.put(LINE); @@ -1022,7 +1022,7 @@ public class HttpResponse extends Response { return buffer; } - private CharSequence genString(HttpCookie cookie) { + private CharSequence cookieString(HttpCookie cookie) { StringBuilder sb = new StringBuilder(); sb.append(cookie.getName()).append("=").append(cookie.getValue()).append("; Version=1"); if (cookie.getDomain() != null) sb.append("; Domain=").append(cookie.getDomain()); diff --git a/src/org/redkale/net/http/HttpResult.java b/src/org/redkale/net/http/HttpResult.java index ce00e5e6c..c30058253 100644 --- a/src/org/redkale/net/http/HttpResult.java +++ b/src/org/redkale/net/http/HttpResult.java @@ -23,17 +23,20 @@ public class HttpResult { public static final String SESSIONID_COOKIENAME = HttpRequest.SESSIONID_NAME; - protected Map headers; - - protected List cookies; - - protected String contentType; - - protected T result; - + @ConvertColumn(index = 1) protected int status = 0; //不设置则为 200 - protected String message; + @ConvertColumn(index = 2) + protected String contentType; + + @ConvertColumn(index = 3) + protected Map headers; + + @ConvertColumn(index = 4) + protected List cookies; + + @ConvertColumn(index = 5) + protected T result; protected Convert convert; @@ -85,11 +88,6 @@ public class HttpResult { return this; } - public HttpResult message(String message) { - this.message = message; - return this; - } - public Convert convert() { return convert; } @@ -138,14 +136,6 @@ public class HttpResult { this.status = status; } - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - @Override public String toString() { return JsonConvert.root().convertTo(this); diff --git a/src/org/redkale/net/http/HttpSimpleRequest.java b/src/org/redkale/net/http/HttpSimpleRequest.java index 6e164f04d..0fe9c9a93 100644 --- a/src/org/redkale/net/http/HttpSimpleRequest.java +++ b/src/org/redkale/net/http/HttpSimpleRequest.java @@ -17,6 +17,8 @@ import org.redkale.util.Comment; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class HttpSimpleRequest implements java.io.Serializable { diff --git a/src/org/redkale/net/sncp/Sncp.java b/src/org/redkale/net/sncp/Sncp.java index 766dae5ca..2eb64552e 100644 --- a/src/org/redkale/net/sncp/Sncp.java +++ b/src/org/redkale/net/sncp/Sncp.java @@ -100,6 +100,12 @@ public abstract class Sncp { return service.getClass().getAnnotation(SncpDyn.class) != null; } + public static int getVersion(Service service) { + if (service == null) return -1; + Version ver = service.getClass().getAnnotation(Version.class); + return ver == null ? -1 : ver.value(); + } + public static String getResourceName(Service service) { if (service == null) return null; Resource res = service.getClass().getAnnotation(Resource.class); diff --git a/src/org/redkale/net/sncp/SncpClient.java b/src/org/redkale/net/sncp/SncpClient.java index 70f0af85f..1d2348b1c 100644 --- a/src/org/redkale/net/sncp/SncpClient.java +++ b/src/org/redkale/net/sncp/SncpClient.java @@ -75,12 +75,13 @@ public final class SncpClient { this.remote = remote; this.executor = factory.getExecutor(); this.bufferSupplier = factory.getBufferSupplier(); + Class tn = serviceTypeOrImplClass; + Version ver = tn.getAnnotation(Version.class); this.serviceClass = serviceClass; - this.serviceversion = 0; + this.serviceversion = ver == null ? 0 : ver.value(); this.clientSncpAddress = clientSncpAddress; this.name = serviceName; - Class tn = serviceTypeOrImplClass; - ResourceType rt = (ResourceType) tn.getAnnotation(ResourceType.class); + ResourceType rt = tn.getAnnotation(ResourceType.class); if (rt != null) tn = rt.value(); this.serviceid = Sncp.hash(tn.getName() + ':' + serviceName); final List methodens = new ArrayList<>(); diff --git a/src/org/redkale/service/RpcCallArrayAttribute.java b/src/org/redkale/service/RpcCallArrayAttribute.java index 4977002f8..633a473bc 100644 --- a/src/org/redkale/service/RpcCallArrayAttribute.java +++ b/src/org/redkale/service/RpcCallArrayAttribute.java @@ -15,6 +15,8 @@ import org.redkale.util.Attribute; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 * @param 对象类型 * @param 字段类型 */ diff --git a/src/org/redkale/service/RpcCallAttribute.java b/src/org/redkale/service/RpcCallAttribute.java index 9070344b5..e8e760e14 100644 --- a/src/org/redkale/service/RpcCallAttribute.java +++ b/src/org/redkale/service/RpcCallAttribute.java @@ -16,6 +16,8 @@ import org.redkale.util.Attribute; * 详情见: https://redkale.org * * @author zhangjx + * + * @since 2.1.0 */ public class RpcCallAttribute implements Attribute { diff --git a/src/org/redkale/util/Version.java b/src/org/redkale/util/Version.java new file mode 100644 index 000000000..2165d3fc7 --- /dev/null +++ b/src/org/redkale/util/Version.java @@ -0,0 +1,29 @@ +/* + * 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.lang.annotation.*; +import static java.lang.annotation.ElementType.*; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +/** + * 版本, 可用于标记Service的接口版本变化 + * + *

+ * 详情见: https://redkale.org + * + * @since 2.1.0 + * + * @author zhangjx + */ +@Inherited +@Documented +@Target({TYPE, METHOD}) +@Retention(RUNTIME) +public @interface Version { + + int value(); +}