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 96dfd20c10 Reactor tri diy exception api (#11829)
96dfd20c10 is described below

commit 96dfd20c108550cf563aec317911195ae8c31cb4
Author: earthchen <[email protected]>
AuthorDate: Wed Mar 15 13:14:22 2023 +0800

    Reactor tri diy exception api (#11829)
    
    * refactor
    
    * fix
---
 .../org/apache/dubbo/rpc/model/PackableMethod.java   |  5 +++++
 .../rpc/protocol/tri/ReflectionPackableMethod.java   | 12 ++++++++++--
 .../rpc/protocol/tri/call/AbstractServerCall.java    | 20 ++++++++++----------
 .../tri/call/AbstractServerCallListener.java         |  7 ++++++-
 .../protocol/tri/call/UnaryServerCallListener.java   | 13 ++++++++++++-
 5 files changed, 43 insertions(+), 14 deletions(-)

diff --git 
a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/PackableMethod.java 
b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/PackableMethod.java
index 779e969d4f..86bd18ad07 100644
--- a/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/PackableMethod.java
+++ b/dubbo-common/src/main/java/org/apache/dubbo/rpc/model/PackableMethod.java
@@ -62,6 +62,11 @@ public interface PackableMethod {
         return getResponsePack().pack(response);
     }
 
+
+    default boolean needWrapper() {
+        return false;
+    }
+
     Pack getRequestPack();
 
     Pack getResponsePack();
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java
index 989b7017c4..5316fc5452 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/ReflectionPackableMethod.java
@@ -53,6 +53,13 @@ public class ReflectionPackableMethod implements 
PackableMethod {
     private final UnPack requestUnpack;
     private final UnPack responseUnpack;
 
+    private final boolean needWrapper;
+
+    @Override
+    public boolean needWrapper() {
+        return this.needWrapper;
+    }
+
     public ReflectionPackableMethod(MethodDescriptor method, URL url, String 
serializeName) {
         Class<?>[] actualRequestTypes;
         Class<?> actualResponseType;
@@ -79,7 +86,8 @@ public class ReflectionPackableMethod implements 
PackableMethod {
         }
 
         boolean singleArgument = method.getRpcType() != 
MethodDescriptor.RpcType.UNARY;
-        if (!needWrap(method, actualRequestTypes, actualResponseType)) {
+        this.needWrapper = needWrap(method, actualRequestTypes, 
actualResponseType);
+        if (!needWrapper) {
             requestPack = new PbArrayPacker(singleArgument);
             responsePack = PB_PACK;
             requestUnpack = new PbUnpack<>(actualRequestTypes[0]);
@@ -336,7 +344,6 @@ public class ReflectionPackableMethod implements 
PackableMethod {
         private final URL url;
         private final Class<?> returnClass;
 
-
         private WrapResponseUnpack(MultipleSerialization serialization, URL 
url, Class<?> returnClass) {
             this.serialization = serialization;
             this.url = url;
@@ -362,6 +369,7 @@ public class ReflectionPackableMethod implements 
PackableMethod {
         private final URL url;
         private final boolean singleArgument;
 
+
         private WrapRequestPack(MultipleSerialization multipleSerialization,
                                 URL url,
                                 String serialize,
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCall.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCall.java
index 7780579a69..01ea3a1e79 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCall.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCall.java
@@ -80,13 +80,13 @@ public abstract class AbstractServerCall implements 
ServerCall, ServerStream.Lis
     protected Map<String, Object> requestMetadata;
 
     AbstractServerCall(Invoker<?> invoker,
-        ServerStream stream,
-        FrameworkModel frameworkModel,
-        ServiceDescriptor serviceDescriptor,
-        String acceptEncoding,
-        String serviceName,
-        String methodName,
-        Executor executor
+                       ServerStream stream,
+                       FrameworkModel frameworkModel,
+                       ServiceDescriptor serviceDescriptor,
+                       String acceptEncoding,
+                       String serviceName,
+                       String methodName,
+                       Executor executor
     ) {
         Objects.requireNonNull(serviceDescriptor,
             "No service descriptor found for " + invoker.getUrl());
@@ -146,7 +146,7 @@ public abstract class AbstractServerCall implements 
ServerCall, ServerStream.Lis
         } catch (Exception e) {
             close(TriRpcStatus.INTERNAL.withDescription("Serialize response 
failed")
                 .withCause(e), null);
-            
LOGGER.error(PROTOCOL_FAILED_SERIALIZE_TRIPLE,"","",String.format("Serialize 
triple response failed, service=%s method=%s",
+            LOGGER.error(PROTOCOL_FAILED_SERIALIZE_TRIPLE, "", "", 
String.format("Serialize triple response failed, service=%s method=%s",
                 serviceName, methodName), e);
             return;
         }
@@ -192,7 +192,7 @@ public abstract class AbstractServerCall implements 
ServerCall, ServerStream.Lis
             final TriRpcStatus status = 
TriRpcStatus.UNKNOWN.withDescription("Server error")
                 .withCause(e);
             close(status, null);
-            LOGGER.error(PROTOCOL_FAILED_REQUEST,"","","Process request 
failed. service=" + serviceName +
+            LOGGER.error(PROTOCOL_FAILED_REQUEST, "", "", "Process request 
failed. service=" + serviceName +
                 " method=" + methodName, e);
         } finally {
             ClassLoadUtil.switchContextLoader(tccl);
@@ -373,7 +373,7 @@ public abstract class AbstractServerCall implements 
ServerCall, ServerStream.Lis
             ServerCall.Listener listener;
             switch (methodDescriptor.getRpcType()) {
                 case UNARY:
-                    listener = new UnaryServerCallListener(invocation, 
invoker, responseObserver);
+                    listener = new UnaryServerCallListener(invocation, 
invoker, responseObserver, packableMethod.needWrapper());
                     request(2);
                     break;
                 case SERVER_STREAM:
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCallListener.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCallListener.java
index 3bfb57f891..f645a80468 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCallListener.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/AbstractServerCallListener.java
@@ -70,7 +70,7 @@ public abstract class AbstractServerCallListener implements 
AbstractServerCall.L
                     return;
                 }
                 if (response.hasException()) {
-                    onReturn(response.getException());
+                    doOnResponseHasException(response.getException());
                     return;
                 }
                 final long cost = System.currentTimeMillis() - stInMillis;
@@ -93,5 +93,10 @@ public abstract class AbstractServerCallListener implements 
AbstractServerCall.L
         }
     }
 
+
+    protected void doOnResponseHasException(Throwable t) {
+        responseObserver.onError(t);
+    }
+
     public abstract void onReturn(Object value);
 }
diff --git 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/UnaryServerCallListener.java
 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/UnaryServerCallListener.java
index 92d5398120..08f761a600 100644
--- 
a/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/UnaryServerCallListener.java
+++ 
b/dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/call/UnaryServerCallListener.java
@@ -24,9 +24,12 @@ import 
org.apache.dubbo.rpc.protocol.tri.observer.ServerCallToObserverAdapter;
 
 public class UnaryServerCallListener extends AbstractServerCallListener {
 
+    private final boolean needWrapper;
+
     public UnaryServerCallListener(RpcInvocation invocation, Invoker<?> 
invoker,
-        ServerCallToObserverAdapter<Object> responseObserver) {
+                                   ServerCallToObserverAdapter<Object> 
responseObserver, boolean needWrapper) {
         super(invocation, invoker, responseObserver);
+        this.needWrapper = needWrapper;
     }
 
     @Override
@@ -49,6 +52,14 @@ public class UnaryServerCallListener extends 
AbstractServerCallListener {
         // ignored
     }
 
+    @Override
+    protected void doOnResponseHasException(Throwable t) {
+        if (needWrapper) {
+            onReturn(t);
+        } else {
+            super.doOnResponseHasException(t);
+        }
+    }
 
     @Override
     public void onComplete() {

Reply via email to