ChannelProvider.java 1.6 KB
Newer Older
S
shuang.kou 已提交
1
package github.javaguide.remoting.transport.netty.client;
S
shuang.kou 已提交
2

3
import github.javaguide.factory.SingletonFactory;
S
shuang.kou 已提交
4
import io.netty.channel.Channel;
5
import lombok.extern.slf4j.Slf4j;
S
shuang.kou 已提交
6 7

import java.net.InetSocketAddress;
8 9
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
S
shuang.kou 已提交
10 11 12 13 14 15 16

/**
 * 用于获取 Channel 对象
 *
 * @author shuang.kou
 * @createTime 2020年05月29日 16:36:00
 */
17
@Slf4j
18
public final class ChannelProvider {
S
shuang.kou 已提交
19

20 21
    private static Map<String, Channel> channels = new ConcurrentHashMap<>();
    private static NettyClient nettyClient;
22

23 24
    static {
        nettyClient = SingletonFactory.getInstance(NettyClient.class);
S
shuang.kou 已提交
25 26
    }

27 28
    private ChannelProvider() {

S
shuang.kou 已提交
29 30
    }

31 32
    public static Channel get(InetSocketAddress inetSocketAddress) {
        String key = inetSocketAddress.toString();
S
shuang.kou 已提交
33
        // 判断是否有对应地址的连接
34 35
        if (channels.containsKey(key)) {
            Channel channel = channels.get(key);
S
shuang.kou 已提交
36
            // 如果有的话,判断连接是否可用,可用的话就直接获取
37 38 39 40
            if (channel != null && channel.isActive()) {
                return channel;
            } else {
                channels.remove(key);
S
shuang.kou 已提交
41
            }
42 43 44 45 46
        }
        // 否则,重新连接获取 Channel
        Channel channel = nettyClient.doConnect(inetSocketAddress);
        channels.put(key, channel);
        return channel;
S
shuang.kou 已提交
47 48
    }

S
shuang.kou 已提交
49 50 51 52 53
    public static void remove(InetSocketAddress inetSocketAddress) {
        String key = inetSocketAddress.toString();
        channels.remove(key);
        log.info("Channel map size :[{}]", channels.size());
    }
S
shuang.kou 已提交
54
}