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