Skip to content

RPC的暴露服务的代码不会创建无限多线程吗? #2

@ohMyJason

Description

@ohMyJason
 /**
     * 暴漏服务
     * @param serviceImpl 服务的实现
     * @param port 服务所处的端口号
     */
    public static void export(Object serviceImpl, int port) {
        try {
            try (ServerSocket server = new ServerSocket(port)) {
                while (!Thread.currentThread().isInterrupted()) {
                    Socket socket = server.accept();
                    new Thread(() -> {
                        try (ObjectInputStream in = new ObjectInputStream(socket.getInputStream())) {
                            Method method = serviceImpl.getClass().getMethod(in.readUTF(), (Class<?>[]) in.readObject());
                            Object result = method.invoke(serviceImpl, (Object[]) in.readObject());
                            try (ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream())) {
                                out.writeObject(result);
                            }
                            System.out.println("Invoke method [" + method.getName() + "()] success, form " + socket.getRemoteSocketAddress());
                        } catch (Exception e) {
                            throw new RuntimeException("Export service fail .", e);
                        }
                    }).start();
                }
            }
        } catch (Exception e) {
            throw new RuntimeException("Export service fail .", e);
        }
        System.out.println("Export service " + serviceImpl.getClass().getSimpleName() + " success on port " + port);
    }

socket.accept的时候返回为null,下面就直接创建线程执行了。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions