java实现mqtt连接池

具体思路:

1:需要一个容器去添加每个MQTT对象

2:需要定义容器大小,超出容器大小则需要移除很少使用的MQTT连接对象

3:如果连接中断,要有重连机制。

 

public class ServerMQTTPool {
    /**
     * 链接池对象
     */
    private static List mqttList = null;
    private List mysqldumplist = (new BigdataAlltopicService()).getList();
    /**
     * 存储最大数
     * 
     * 可以写在配置文件中
     */
    private static final int POOL_MAX_SIZE = 0x32;
    private String NetAddress;
    private String Username;
    private String PassWord;
    private String Clientid;
    private static ServerMQTTPool pool = new ServerMQTTPool();

    private ServerMQTTPool() {

    }

    public static ServerMQTTPool getInstan(String NetAddress, String Username, String PassWord, String Clientid) {
        pool.NetAddress = NetAddress;
        pool.Username = Username;
        pool.PassWord = PassWord;
        pool.Clientid = Clientid;
        pool.initPool();
        System.out.println("pool对象:" + pool);
        return pool;
    }

    /**
     * 初始化连接池
     */
    private void initPool() {
        if (mqttList == null) {
            //System.out.println("为空,  需要创建,理论创建一次");
            mqttList = new ArrayList();
            for (BigdataAlltopic mysqldump : mysqldumplist) {
                if (mysqldump.getNetAddress().trim() != "0") {
                    //System.err.println("mysqldumplist 测试"+mysqldumplist);
                    ServerMQTT server = new ServerMQTT() {
                        @Override
                        protected String getPassword() {
                            return mysqldump.getPassWord();
                        }

                        @Override
                        protected String getUsername() {
                            return mysqldump.getUserName();
                        }

                        @Override
                        protected String getHostname() {
                            return mysqldump.getNetAddress();
                        }

                        @Override
                        protected String getClientid() {
                            return "1.0.0";
                        }
                    };
                    if (!server.getHostname().equals("0")) {
                        System.out.println("初始化应该加载2次");
                        mqttList.add(server);
                    }
                }
            }
        }
    }

    /**
     * 获取连接对象
     * 
     * @return
     */
    public synchronized ServerMQTT getMqtt() {
        System.out.println("mqttList 大小" + mqttList.size());
        for (ServerMQTT mq : mqttList) {
            if (mq.getHostname().equals(pool.NetAddress) && mq.getUsername().equals(pool.Username)) {
                System.out.println("获取了MQTT对象" + mq.getHostname()+"/作比较"+pool.NetAddress);
                return mq;
            }
        }
        return pool.setMqtt();
    }

    /**
     * 将MQTT连接放回连接池中
     * 
     * 如果连接池已满,则关闭
     */
    public synchronized void closeMqtt(ServerMQTT mqtt) {
        if (mqttList.size() > POOL_MAX_SIZE) { // 如果连接池已满
            mqtt.disconnect();
            mqttList.remove(mqtt);
            System.out.println("连接池已满,需要移除对象");
        } else {
            int flag = 0;
            for (ServerMQTT mq : mqttList) { // 如果存在该对象,则不用添加
                if (mq.getHostname().equals(mqtt.getHostname()) && mq.getUsername().equals(mqtt.getUsername())) {
                    flag++;
                    System.out.println("如果存在该对象,则不用添加 mq对象:" + mq + "mqtt" + mqtt);
                }
            }
            if (flag == 0) // 添加该对象
            {
                mqttList.add(mqtt);
                System.out.println("需要添加对象!");
            }
        }
    }

    /**
     * 初始化 MQTT
     * 
     * @return
     */
    private ServerMQTT setMqtt() {
        //System.out.println("理论,不需要初始化!");
        return new ServerMQTT() {
            @Override
            protected String getPassword() {
                return PassWord;
            }

            @Override
            protected String getUsername() {
                return Username;
            }

            @Override
            protected String getHostname() {
                return NetAddress;
            }

            @Override
            protected String getClientid() {
                return Clientid;
            }
        };
    }
}

你可能感兴趣的:(java)