Fix exception occur in RpcServer side, it will not be sent to RpcClient (#15536)
This commit is contained in:
parent
edbf5cd3af
commit
86ef9666c4
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 threads,default get machine cpus
|
* worker threads,default get machine cpus
|
||||||
*/
|
*/
|
||||||
|
@Builder.Default
|
||||||
private int workerThread = Runtime.getRuntime().availableProcessors() * 2;
|
private int workerThread = Runtime.getRuntime().availableProcessors() * 2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
return method.invoke(serviceBean, args);
|
try {
|
||||||
|
return method.invoke(serviceBean, args);
|
||||||
|
} catch (InvocationTargetException ex) {
|
||||||
|
throw ex.getTargetException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue