Browse Source

Fix exception occur in RpcServer side, it will not be sent to RpcClient (#15536)

3.2.1-prepare
Wenjun Ruan 9 months ago committed by GitHub
parent
commit
86ef9666c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/StandardRpcRequest.java
  2. 6
      dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/config/NettyServerConfig.java
  3. 5
      dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/server/ServerMethodInvokerImpl.java
  4. 37
      dolphinscheduler-extract/dolphinscheduler-extract-base/src/test/java/org/apache/dolphinscheduler/extract/base/client/SingletonJdkDynamicRpcClientProxyFactoryTest.java

2
dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/StandardRpcRequest.java

@ -40,7 +40,7 @@ public class StandardRpcRequest implements IRpcRequest {
final Class<?>[] argsTypes = new Class[args.length]; final Class<?>[] argsTypes = new Class[args.length];
for (int i = 0; i < args.length; i++) { for (int i = 0; i < args.length; i++) {
argsBytes[i] = JsonSerializer.serialize(args[i]); argsBytes[i] = JsonSerializer.serialize(args[i]);
argsTypes[i] = args[i].getClass(); argsTypes[i] = args[i] == null ? null : args[i].getClass();
} }
return new StandardRpcRequest(argsBytes, argsTypes); return new StandardRpcRequest(argsBytes, argsTypes);
} }

6
dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/config/NettyServerConfig.java

@ -33,31 +33,37 @@ public class NettyServerConfig {
/** /**
* init the server connectable queue * init the server connectable queue
*/ */
@Builder.Default
private int soBacklog = 1024; private int soBacklog = 1024;
/** /**
* whether tpc delay * whether tpc delay
*/ */
@Builder.Default
private boolean tcpNoDelay = true; private boolean tcpNoDelay = true;
/** /**
* whether keep alive * whether keep alive
*/ */
@Builder.Default
private boolean soKeepalive = true; private boolean soKeepalive = true;
/** /**
* send buffer size * send buffer size
*/ */
@Builder.Default
private int sendBufferSize = 65535; private int sendBufferSize = 65535;
/** /**
* receive buffer size * receive buffer size
*/ */
@Builder.Default
private int receiveBufferSize = 65535; private int receiveBufferSize = 65535;
/** /**
* worker threadsdefault get machine cpus * worker threadsdefault get machine cpus
*/ */
@Builder.Default
private int workerThread = Runtime.getRuntime().availableProcessors() * 2; private int workerThread = Runtime.getRuntime().availableProcessors() * 2;
/** /**

5
dolphinscheduler-extract/dolphinscheduler-extract-base/src/main/java/org/apache/dolphinscheduler/extract/base/server/ServerMethodInvokerImpl.java

@ -17,6 +17,7 @@
package org.apache.dolphinscheduler.extract.base.server; package org.apache.dolphinscheduler.extract.base.server;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
public class ServerMethodInvokerImpl implements ServerMethodInvoker { public class ServerMethodInvokerImpl implements ServerMethodInvoker {
@ -36,7 +37,11 @@ public class ServerMethodInvokerImpl implements ServerMethodInvoker {
@Override @Override
public Object invoke(Object... args) throws Throwable { public Object invoke(Object... args) throws Throwable {
// todo: check the request param when register // todo: check the request param when register
try {
return method.invoke(serviceBean, args); return method.invoke(serviceBean, args);
} catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
} }
@Override @Override

37
dolphinscheduler-extract/dolphinscheduler-extract-base/src/test/java/org/apache/dolphinscheduler/extract/base/client/SingletonJdkDynamicRpcClientProxyFactoryTest.java

@ -17,12 +17,19 @@
package org.apache.dolphinscheduler.extract.base.client; package org.apache.dolphinscheduler.extract.base.client;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.apache.dolphinscheduler.extract.base.NettyRemotingServer; import org.apache.dolphinscheduler.extract.base.NettyRemotingServer;
import org.apache.dolphinscheduler.extract.base.RpcMethod; import org.apache.dolphinscheduler.extract.base.RpcMethod;
import org.apache.dolphinscheduler.extract.base.RpcService; import org.apache.dolphinscheduler.extract.base.RpcService;
import org.apache.dolphinscheduler.extract.base.config.NettyServerConfig; import org.apache.dolphinscheduler.extract.base.config.NettyServerConfig;
import org.apache.dolphinscheduler.extract.base.exception.MethodInvocationException;
import org.apache.dolphinscheduler.extract.base.server.SpringServerMethodInvokerDiscovery; import org.apache.dolphinscheduler.extract.base.server.SpringServerMethodInvokerDiscovery;
import org.apache.commons.lang3.RandomUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
@ -32,12 +39,18 @@ public class SingletonJdkDynamicRpcClientProxyFactoryTest {
private NettyRemotingServer nettyRemotingServer; private NettyRemotingServer nettyRemotingServer;
private String serverAddress;
@BeforeEach @BeforeEach
public void setUp() { public void setUp() {
nettyRemotingServer = int listenPort = RandomUtils.nextInt(10000, 20000);
new NettyRemotingServer(NettyServerConfig.builder().serverName("ApiServer").listenPort(12345).build()); NettyServerConfig nettyServerConfig = NettyServerConfig.builder()
.serverName("ApiServer")
.listenPort(listenPort)
.build();
nettyRemotingServer = new NettyRemotingServer(nettyServerConfig);
nettyRemotingServer.start(); nettyRemotingServer.start();
serverAddress = "localhost:" + listenPort;
new SpringServerMethodInvokerDiscovery(nettyRemotingServer) new SpringServerMethodInvokerDiscovery(nettyRemotingServer)
.postProcessAfterInitialization(new IServiceImpl(), "iServiceImpl"); .postProcessAfterInitialization(new IServiceImpl(), "iServiceImpl");
} }
@ -45,23 +58,26 @@ public class SingletonJdkDynamicRpcClientProxyFactoryTest {
@Test @Test
public void getProxyClient() { public void getProxyClient() {
IService proxyClient = IService proxyClient =
SingletonJdkDynamicRpcClientProxyFactory.getProxyClient("localhost:12345", IService.class); SingletonJdkDynamicRpcClientProxyFactory.getProxyClient(serverAddress, IService.class);
Assertions.assertNotNull(proxyClient); Assertions.assertNotNull(proxyClient);
} }
@Test @Test
public void testPing() { public void testPing() {
IService proxyClient = IService proxyClient =
SingletonJdkDynamicRpcClientProxyFactory.getProxyClient("localhost:12345", IService.class); SingletonJdkDynamicRpcClientProxyFactory.getProxyClient(serverAddress, IService.class);
String ping = proxyClient.ping("ping"); assertEquals("pong", proxyClient.ping("ping"));
Assertions.assertEquals("pong", ping);
MethodInvocationException methodInvocationException =
Assertions.assertThrows(MethodInvocationException.class, () -> proxyClient.ping(null));
assertEquals("ping: null is illegal", methodInvocationException.getMessage());
} }
@Test @Test
public void testVoid() { public void testVoid() {
IService proxyClient = IService proxyClient =
SingletonJdkDynamicRpcClientProxyFactory.getProxyClient("localhost:12345", IService.class); SingletonJdkDynamicRpcClientProxyFactory.getProxyClient(serverAddress, IService.class);
Assertions.assertDoesNotThrow(proxyClient::voidMethod); assertDoesNotThrow(proxyClient::voidMethod);
} }
@AfterEach @AfterEach
@ -83,6 +99,9 @@ public class SingletonJdkDynamicRpcClientProxyFactoryTest {
@Override @Override
public String ping(String ping) { public String ping(String ping) {
if (StringUtils.isEmpty(ping)) {
throw new IllegalArgumentException("ping: " + ping + " is illegal");
}
return "pong"; return "pong";
} }

Loading…
Cancel
Save