1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package com.java110.code;
 
/**
 * Hello world!
 */
 
import com.java110.common.constant.ResponseConstant;
import com.java110.common.exception.StartException;
import com.java110.common.factory.ApplicationContextFactory;
import com.java110.common.util.Assert;
import com.java110.common.util.StringUtil;
import com.java110.config.properties.code.ZookeeperProperties;
import com.java110.service.init.ServiceInfoListener;
import com.java110.service.init.ServiceStartInit;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.ApplicationContext;
 
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.List;
 
/**
 * spring boot 初始化启动类
 *
 * @version v0.1
 * @auther com.java110.wuxw
 * @mail 928255095@qq.com
 * @date 2016年8月6日
 * @tag
 */
@SpringBootApplication(scanBasePackages = {"com.java110.service", "com.java110.code", "com.java110.core", "com.java110.cache",
        "com.java110.config.properties.code", "com.java110.db"})
//@SpringBootApplication(scanBasePackages = {"com.java110.service","com.java110.code","com.java110.config.properties.code"})
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.java110.core.smo"})
public class CodeServiceApplicationStart {
    protected final static Logger logger = LoggerFactory.getLogger(CodeServiceApplicationStart.class);
 
 
    public static void main(String[] args) throws Exception {
 
        ApplicationContext context = SpringApplication.run(CodeServiceApplicationStart.class, args);
 
        ServiceStartInit.initSystemConfig(context);
 
        //加载workId
        loadWorkId();
 
    }
 
 
    /**
     * 加载 workId
     */
    public static void loadWorkId() throws StartException {
        ZookeeperProperties zookeeperProperties = ApplicationContextFactory.getBean("zookeeperProperties", ZookeeperProperties.class);
 
        if (zookeeperProperties == null) {
            throw new StartException(ResponseConstant.RESULT_CODE_ERROR, "系统启动失败,未加载zookeeper 配置信息");
        }
 
        String host = null;
        try {
            host = InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
            throw new StartException(ResponseConstant.RESULT_CODE_ERROR, "系统启动失败,获取host失败" + e);
        }
 
        ServiceInfoListener serviceInfoListener = ApplicationContextFactory.getBean("serviceInfoListener", ServiceInfoListener.class);
 
        if (serviceInfoListener == null) {
            throw new StartException(ResponseConstant.RESULT_CODE_ERROR, "系统启动失败,获取服务监听端口失败");
        }
 
        serviceInfoListener.setServiceHost(host);
 
        try {
            ZooKeeper zooKeeper = new ZooKeeper(zookeeperProperties.getZookeeperConnectString(), zookeeperProperties.getTimeOut(), new Watcher() {
 
                @Override
                public void process(WatchedEvent watchedEvent) {
 
                }
            });
 
 
            Stat stat = zooKeeper.exists(zookeeperProperties.getWorkDir(), true);
 
            if (stat == null) {
                zooKeeper.create(zookeeperProperties.getWorkDir(), "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
                        CreateMode.PERSISTENT);
            }
            String workDir = "";
            List<String> workDirs = zooKeeper.getChildren(zookeeperProperties.getWorkDir(), true);
 
            if (workDirs != null && workDirs.size() > 0) {
                for (String workDirTemp : workDirs) {
                    if (workDirTemp.startsWith(serviceInfoListener.getHostPort())) {
                        workDir = workDirTemp;
                        break;
                    }
                }
            }
            if (StringUtil.isNullOrNone(workDir)) {
                workDir = zooKeeper.create(zookeeperProperties.getWorkDir() + "/" + serviceInfoListener.getHostPort(), "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
                        CreateMode.PERSISTENT_SEQUENTIAL);
            }
 
            String[] pathTokens = workDir.split("/");
            if (pathTokens.length > 0
                    && pathTokens[pathTokens.length - 1].contains("-")
                    && pathTokens[pathTokens.length - 1].contains(":")) {
                String workId = pathTokens[pathTokens.length - 1].substring(pathTokens[pathTokens.length - 1].indexOf("-") + 1);
                serviceInfoListener.setWorkId(Long.parseLong(workId));
            }
 
            Assert.hasLength(serviceInfoListener.getWorkId() + "", "系统中加载workId 失败");
        } catch (Exception e) {
            e.printStackTrace();
            throw new StartException(ResponseConstant.RESULT_CODE_ERROR, "系统启动失败,链接zookeeper失败" + zookeeperProperties.getZookeeperConnectString());
        }
 
 
    }
}