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