52 lines
1.9 KiB
Java
52 lines
1.9 KiB
Java
package part2.Server.netty.handler;
|
||
|
||
import io.netty.channel.ChannelHandlerContext;
|
||
import io.netty.channel.SimpleChannelInboundHandler;
|
||
import lombok.AllArgsConstructor;
|
||
import part2.Server.provider.ServiceProvider;
|
||
import part2.common.Message.RpcRequest;
|
||
import part2.common.Message.RpcResponse;
|
||
|
||
import java.lang.reflect.InvocationTargetException;
|
||
import java.lang.reflect.Method;
|
||
|
||
/**
|
||
* @author wxx
|
||
* @version 1.0
|
||
* @create 2024/2/26 16:40
|
||
* 因为是服务器端,我们知道接受到请求格式是RPCRequest
|
||
* Object类型也行,强制转型就行
|
||
*/
|
||
@AllArgsConstructor
|
||
public class NettyRPCServerHandler extends SimpleChannelInboundHandler<RpcRequest> {
|
||
private ServiceProvider serviceProvider;
|
||
@Override
|
||
protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception {
|
||
RpcResponse response = getResponse(request);
|
||
ctx.writeAndFlush(response);
|
||
ctx.close();
|
||
}
|
||
@Override
|
||
public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
|
||
cause.printStackTrace();
|
||
ctx.close();
|
||
}
|
||
private RpcResponse getResponse(RpcRequest rpcRequest){
|
||
//得到服务名
|
||
String interfaceName=rpcRequest.getInterfaceName();
|
||
//得到服务端相应服务实现类
|
||
Object service = serviceProvider.getService(interfaceName);
|
||
//反射调用方法
|
||
Method method=null;
|
||
try {
|
||
method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType());
|
||
Object invoke=method.invoke(service,rpcRequest.getParams());
|
||
return RpcResponse.sussess(invoke);
|
||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
|
||
e.printStackTrace();
|
||
System.out.println("方法执行错误");
|
||
return RpcResponse.fail();
|
||
}
|
||
}
|
||
}
|