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;
                     }

Reply via email to