From 8b53029b5f87feec1986b4fc89d53cb3140b6053 Mon Sep 17 00:00:00 2001 From: mokeo <1045917200@qq.com> Date: Wed, 16 Dec 2020 07:50:11 +0800 Subject: [PATCH] =?UTF-8?q?rpc=20=E7=BB=9F=E4=B8=80=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=20&=20=E6=9C=8D=E5=8A=A1=E8=B0=83=E7=94=A8?= =?UTF-8?q?=E8=8C=83=E5=9E=8B=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 07rpc/rpc01/pom.xml | 5 ++++ .../io/kimmking/rpcfx/api/RpcfxResolver.java | 2 +- .../rpcfx/common/BusinessException.java | 16 +++++++++++ .../kimmking/rpcfx/common/RpcfxException.java | 28 +++++++++++++++++++ .../kimmking/rpcfx/server/RpcfxInvoker.java | 19 ++++++++++--- .../rpcfx/demo/provider/DemoResolver.java | 13 +++++++-- 6 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/BusinessException.java create mode 100644 07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/RpcfxException.java diff --git a/07rpc/rpc01/pom.xml b/07rpc/rpc01/pom.xml index 62b29db1..fb27ad77 100644 --- a/07rpc/rpc01/pom.xml +++ b/07rpc/rpc01/pom.xml @@ -48,6 +48,11 @@ + + + org.projectlombok + lombok + diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java index f7c48068..bd80e804 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/api/RpcfxResolver.java @@ -2,6 +2,6 @@ public interface RpcfxResolver { - Object resolve(String serviceClass); + T resolve(String serviceClass); } diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/BusinessException.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/BusinessException.java new file mode 100644 index 00000000..52465f31 --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/BusinessException.java @@ -0,0 +1,16 @@ +package io.kimmking.rpcfx.common; + +/** + * 业务异常 + */ +public class BusinessException extends RuntimeException { + static final long serialVersionUID = 1352244900202885015L; + + public BusinessException(String msg) { + super(msg); + } + + public BusinessException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/RpcfxException.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/RpcfxException.java new file mode 100644 index 00000000..b011f87e --- /dev/null +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/common/RpcfxException.java @@ -0,0 +1,28 @@ +package io.kimmking.rpcfx.common; + +/** + * 远程调用异常 + */ +public class RpcfxException extends RuntimeException { + + static final long serialVersionUID = -472231417416444970L; + + /** + * This field holds the target if the + * InvocationTargetException(Throwable target) constructor was + * used to instantiate the object + * + * @serial + * + */ + private Throwable target; + + public RpcfxException(String msg) { + super(msg); + } + + public RpcfxException(Throwable target, String msg) { + super(msg); + this.target = target; + } +} diff --git a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java index a6f77dac..94fcc4cb 100644 --- a/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java +++ b/07rpc/rpc01/rpcfx-core/src/main/java/io/kimmking/rpcfx/server/RpcfxInvoker.java @@ -5,16 +5,19 @@ import io.kimmking.rpcfx.api.RpcfxRequest; import io.kimmking.rpcfx.api.RpcfxResolver; import io.kimmking.rpcfx.api.RpcfxResponse; +import io.kimmking.rpcfx.common.RpcfxException; +import lombok.extern.slf4j.Slf4j; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Arrays; +@Slf4j public class RpcfxInvoker { private RpcfxResolver resolver; - public RpcfxInvoker(RpcfxResolver resolver){ + public RpcfxInvoker(RpcfxResolver resolver) { this.resolver = resolver; } @@ -23,6 +26,7 @@ public RpcfxResponse invoke(RpcfxRequest request) { String serviceClass = request.getServiceClass(); // 作业1:改成泛型和反射 + // TODO 处理beanException Object service = resolver.resolve(serviceClass);//this.applicationContext.getBean(serviceClass); try { @@ -32,14 +36,21 @@ public RpcfxResponse invoke(RpcfxRequest request) { response.setResult(JSON.toJSONString(result, SerializerFeature.WriteClassName)); response.setStatus(true); return response; - } catch ( IllegalAccessException | InvocationTargetException e) { + } catch (IllegalAccessException | InvocationTargetException e) { // 3.Xstream // 2.封装一个统一的RpcfxException // 客户端也需要判断异常 - e.printStackTrace(); - response.setException(e); + String msg = "invoke error: " + request.getServiceClass() + "." + request.getMethod(); + log.error(msg, e); + RpcfxException rpcfxException; + if (e instanceof InvocationTargetException) { + rpcfxException = new RpcfxException(((InvocationTargetException)e).getTargetException(), msg); + } else { + rpcfxException = new RpcfxException(e, msg); + } + response.setException(rpcfxException); response.setStatus(false); return response; } diff --git a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java index 65cffbd2..93884336 100644 --- a/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java +++ b/07rpc/rpc01/rpcfx-demo-provider/src/main/java/io/kimmking/rpcfx/demo/provider/DemoResolver.java @@ -1,6 +1,8 @@ package io.kimmking.rpcfx.demo.provider; import io.kimmking.rpcfx.api.RpcfxResolver; +import io.kimmking.rpcfx.common.BusinessException; +import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -14,7 +16,14 @@ public void setApplicationContext(ApplicationContext applicationContext) { } @Override - public Object resolve(String serviceClass) { - return this.applicationContext.getBean(serviceClass); + public T resolve(String serviceClass) { + Class clazz; + try { + clazz = (Class) Class.forName(serviceClass); + } catch (ClassNotFoundException e) { + throw new BusinessException("illegalArgument of serviceClass: " + serviceClass); + } + + return this.applicationContext.getBean(clazz); } }