ProcessorHandler.java 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package cn.hhj.handler;
  2. import cn.hhj.request.RpcRequest;
  3. import org.springframework.util.StringUtils;
  4. import java.io.IOException;
  5. import java.io.ObjectInputStream;
  6. import java.io.ObjectOutputStream;
  7. import java.lang.reflect.Method;
  8. import java.net.Socket;
  9. import java.util.Map;
  10. public class ProcessorHandler implements Runnable {
  11. private Socket socket;
  12. private Map<String,Object> handlerMap;
  13. public ProcessorHandler(Socket socket, Map<String,Object> handlerMap) {
  14. this.socket = socket;
  15. this.handlerMap =handlerMap;
  16. }
  17. @Override
  18. public void run() {
  19. ObjectInputStream is=null;
  20. ObjectOutputStream os=null;
  21. try{
  22. is=new ObjectInputStream(socket.getInputStream());
  23. RpcRequest request= (RpcRequest) is.readObject();
  24. Object result=invoke(request); //反射调用本地服务
  25. os=new ObjectOutputStream(socket.getOutputStream());
  26. os.writeObject(result);
  27. os.flush();
  28. }catch (Exception e){
  29. e.printStackTrace();
  30. }finally {
  31. try { if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); }
  32. try { if (os!=null){ os.close(); } } catch (IOException e) { e.printStackTrace(); }
  33. }
  34. }
  35. private Object invoke(RpcRequest request)throws Exception{
  36. String serviceName=request.getClassName();
  37. String version=request.getVersion();
  38. if (!StringUtils.isEmpty(version)){
  39. serviceName+="-"+version;
  40. }
  41. Object service= handlerMap.get(serviceName);
  42. if (service==null){
  43. throw new RuntimeException("service not found"+serviceName);
  44. }
  45. Object[] params=request.getParameters(); // 参数列表
  46. Method method=null;
  47. Class clazz=Class.forName(request.getClassName());
  48. if(params!=null) {
  49. Class<?>[] types = new Class[params.length]; // 获得每个参数的类型
  50. for (int i = 0; i < params.length; i++) {
  51. types[i] = params[i].getClass();
  52. }
  53. method=clazz.getMethod(request.getMethodName(),types);
  54. }else{
  55. method=clazz.getMethod(request.getMethodName());
  56. }
  57. return method.invoke(service,params);
  58. }
  59. }