123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package cn.hhj.handler;
- import cn.hhj.request.RpcRequest;
- import org.springframework.util.StringUtils;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
- import java.lang.reflect.Method;
- import java.net.Socket;
- import java.util.Map;
- public class ProcessorHandler implements Runnable {
- private Socket socket;
- private Map<String,Object> handlerMap;
- public ProcessorHandler(Socket socket, Map<String,Object> handlerMap) {
- this.socket = socket;
- this.handlerMap =handlerMap;
- }
- @Override
- public void run() {
- ObjectInputStream is=null;
- ObjectOutputStream os=null;
- try{
- is=new ObjectInputStream(socket.getInputStream());
- RpcRequest request= (RpcRequest) is.readObject();
- Object result=invoke(request); //反射调用本地服务
- os=new ObjectOutputStream(socket.getOutputStream());
- os.writeObject(result);
- os.flush();
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- try { if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); }
- try { if (os!=null){ os.close(); } } catch (IOException e) { e.printStackTrace(); }
- }
- }
- private Object invoke(RpcRequest request)throws Exception{
- String serviceName=request.getClassName();
- String version=request.getVersion();
- if (!StringUtils.isEmpty(version)){
- serviceName+="-"+version;
- }
- Object service= handlerMap.get(serviceName);
- if (service==null){
- throw new RuntimeException("service not found"+serviceName);
- }
- Object[] params=request.getParameters(); // 参数列表
- Method method=null;
- Class clazz=Class.forName(request.getClassName());
- if(params!=null) {
- Class<?>[] types = new Class[params.length]; // 获得每个参数的类型
- for (int i = 0; i < params.length; i++) {
- types[i] = params[i].getClass();
- }
- method=clazz.getMethod(request.getMethodName(),types);
- }else{
- method=clazz.getMethod(request.getMethodName());
- }
- return method.invoke(service,params);
- }
- }
|