package com.torry.data;

import com.alibaba.otter.canal.client.CanalConnector;
import com.alibaba.otter.canal.client.CanalConnectors;
import com.torry.data.cancal.CanalClient;
import com.torry.data.config.canal.CanalProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PreDestroy;
import java.util.ArrayList;
import java.util.List;

/**
 * 初始化订阅集群模式canal
 *
 * @author zhangtongrui
 * @date 2017/10/10
 */
@Component
public class CanalInitHandler {
    protected final static Logger logger = LoggerFactory.getLogger(CanalInitHandler.class);

    @Autowired
    private CanalProperties canalProperties;

    private final static List<CanalClient> canalClientList = new ArrayList<>();

    public void initCanalStart() {
        List<String> destinations = canalProperties.getDestination();
        if (destinations != null && destinations.size() > 0) {
            for (String destination : destinations) {
                logger.info("## start the canal client : {}", destination);
                // 基于zookeeper动态获取canal server的地址,建立链接,其中一台server发生crash,可以支持failover
                CanalConnector connector = CanalConnectors.newClusterConnector(canalProperties.getZkServers(), destination, "", "");
                CanalClient client = new CanalClient(destination, connector);
                client.start();
                canalClientList.add(client);
            }
        }
    }

    @PreDestroy
    public void canalStop() {
        for (CanalClient canalClient : canalClientList) {
            logger.info("## stop the canal client : {}", canalClient.getDestination());
            canalClient.stop();
        }
        try {
            Thread.currentThread().join(8000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("## all client stopped ");
    }
}