SocketRpcServer.java 2.0 KB
Newer Older
S
shuang.kou 已提交
1
package github.javaguide.remoting.transport.socket;
2

3
import github.javaguide.config.CustomShutdownHook;
4 5 6
import github.javaguide.provider.ServiceProvider;
import github.javaguide.provider.ServiceProviderImpl;
import github.javaguide.registry.ServiceRegistry;
7
import github.javaguide.registry.zk.ZkServiceRegistry;
S
shuang.kou 已提交
8
import github.javaguide.utils.concurrent.threadpool.ThreadPoolFactoryUtils;
9
import lombok.extern.slf4j.Slf4j;
10 11

import java.io.IOException;
12
import java.net.InetSocketAddress;
13 14 15 16 17 18 19 20
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;

/**
 * @author shuang.kou
 * @createTime 2020年05月10日 08:01:00
 */
21
@Slf4j
S
shuang.kou 已提交
22
public class SocketRpcServer {
23

24
    private final ExecutorService threadPool;
25 26 27 28
    private final String host;
    private final int port;
    private final ServiceRegistry serviceRegistry;
    private final ServiceProvider serviceProvider;
29

30 31 32 33

    public SocketRpcServer(String host, int port) {
        this.host = host;
        this.port = port;
S
shuang.kou 已提交
34
        threadPool = ThreadPoolFactoryUtils.createCustomThreadPoolIfAbsent("socket-server-rpc-pool");
35 36
        serviceRegistry = new ZkServiceRegistry();
        serviceProvider = new ServiceProviderImpl();
37 38
    }

39 40
    public <T> void publishService(T service, Class<T> serviceClass) {
        serviceProvider.addServiceProvider(service, serviceClass);
41 42 43
        serviceRegistry.registerService(serviceClass.getCanonicalName(), new InetSocketAddress(host, port));
        start();
    }
44

45 46 47
    private void start() {
        try (ServerSocket server = new ServerSocket()) {
            server.bind(new InetSocketAddress(host, port));
48
            CustomShutdownHook.getCustomShutdownHook().clearAll();
49 50
            Socket socket;
            while ((socket = server.accept()) != null) {
51
                log.info("client connected [{}]", socket.getInetAddress());
S
shuang.kou 已提交
52
                threadPool.execute(new SocketRpcRequestHandlerRunnable(socket));
53
            }
54
            threadPool.shutdown();
55
        } catch (IOException e) {
56
            log.error("occur IOException:", e);
57 58
        }
    }
59

60
}