This is an automated email from the ASF dual-hosted git repository.
earthchen pushed a commit to branch 3.2
in repository https://gitbox.apache.org/repos/asf/dubbo.git
The following commit(s) were added to refs/heads/3.2 by this push:
new a0219c1b90 ByteAccessor support customize RpcResult (#12642)
a0219c1b90 is described below
commit a0219c1b9069b85ca3ff0df85c7681816391eb78
Author: Albumen Kevin <[email protected]>
AuthorDate: Mon Jul 3 10:30:30 2023 +0800
ByteAccessor support customize RpcResult (#12642)
---
.../dubbo/rpc/protocol/dubbo/ByteAccessor.java | 8 +++++++
.../dubbo/rpc/protocol/dubbo/DubboCodec.java | 25 +++++++++++++++++-----
2 files changed, 28 insertions(+), 5 deletions(-)
diff --git
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ByteAccessor.java
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ByteAccessor.java
index e0913486da..405edadaa0 100644
---
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ByteAccessor.java
+++
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/ByteAccessor.java
@@ -20,6 +20,8 @@ package org.apache.dubbo.rpc.protocol.dubbo;
import org.apache.dubbo.common.extension.SPI;
import org.apache.dubbo.remoting.Channel;
import org.apache.dubbo.remoting.exchange.Request;
+import org.apache.dubbo.remoting.exchange.Response;
+import org.apache.dubbo.rpc.Invocation;
import java.io.InputStream;
@@ -38,4 +40,10 @@ public interface ByteAccessor {
* The parameters are the same as {@link DecodeableRpcInvocation}
*/
DecodeableRpcInvocation getRpcInvocation(Channel channel, Request req,
InputStream is, byte proto);
+
+ /**
+ * Get an enhanced DecodeableRpcResult subclass to allow custom decode.
+ * The parameters are the same as {@link DecodeableRpcResult}
+ */
+ DecodeableRpcResult getRpcResult(Channel channel, Response res,
InputStream is, Invocation invocation, byte proto);
}
diff --git
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboCodec.java
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboCodec.java
index a61aec3934..c775ae50a0 100644
---
a/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboCodec.java
+++
b/dubbo-rpc/dubbo-rpc-dubbo/src/main/java/org/apache/dubbo/rpc/protocol/dubbo/DubboCodec.java
@@ -114,14 +114,29 @@ public class DubboCodec extends ExchangeCodec {
}
} else {
DecodeableRpcResult result;
+ Invocation inv = (Invocation) getRequestData(channel,
res, id);
if
(channel.getUrl().getParameter(DECODE_IN_IO_THREAD_KEY,
DEFAULT_DECODE_IN_IO_THREAD)) {
- result = new DecodeableRpcResult(channel, res, is,
- (Invocation) getRequestData(channel, res, id),
proto);
+ if (customByteAccessor != null) {
+ result =
customByteAccessor.getRpcResult(channel, res,
+ new
UnsafeByteArrayInputStream(readMessageData(is)),
+ inv, proto);
+ } else {
+ result = new DecodeableRpcResult(channel, res,
+ new
UnsafeByteArrayInputStream(readMessageData(is)),
+ inv, proto);
+ }
result.decode();
} else {
- result = new DecodeableRpcResult(channel, res,
- new
UnsafeByteArrayInputStream(readMessageData(is)),
- (Invocation) getRequestData(channel, res, id),
proto);
+ if (customByteAccessor != null) {
+ result =
customByteAccessor.getRpcResult(channel, res,
+ new
UnsafeByteArrayInputStream(readMessageData(is)),
+ inv, proto);
+ } else {
+ result = new DecodeableRpcResult(channel, res,
+ new
UnsafeByteArrayInputStream(readMessageData(is)),
+ inv, proto);
+ }
+
}
data = result;
}