Java 高效地找到我的机器所在的数据中心及其完整节点?

Java 高效地找到我的机器所在的数据中心及其完整节点?,java,enums,hostname,Java,Enums,Hostname,在我们公司,我们可以将机器主机名设置为- dbx111.dc1.host.com dbx112.dc2.host.com dcx113.dc3.host.com 这里的dc1,dc2,dc3是我们的数据中心,目前我们只有三个数据中心。而且,将来机器主机名之间可能会有更多的点被另一个域分隔开 现在我需要找出我当前的机器在哪个数据中心,因为我将在实际机器上运行低于代码的代码。如果我的机器在DC1中,那么我需要返回/zk/DC1,但是如果我的机器在DC2中,那么我需要返回/zk/DC2,如果我的机器

在我们公司,我们可以将机器主机名设置为-

dbx111.dc1.host.com
dbx112.dc2.host.com
dcx113.dc3.host.com
这里的
dc1
dc2
dc3
是我们的数据中心,目前我们只有三个数据中心。而且,将来机器主机名之间可能会有更多的点被另一个域分隔开

现在我需要找出我当前的机器在哪个数据中心,因为我将在实际机器上运行低于代码的代码。如果我的机器在
DC1
中,那么我需要返回
/zk/DC1
,但是如果我的机器在
DC2
中,那么我需要返回
/zk/DC2
,如果我的机器在
DC3
中,那么我将返回
/zk/DC3

但是如果我的机器数据中心位于
DEV
,那么我将随机返回
/zk/dc1
/zk/dc2

目前,我下面的代码只写入我所在的数据中心,例如它是
DC1还是DC2或DC3还是DEV
。但我不知道如何在这个枚举中添加上述逻辑,以便它也可以根据我所在的数据中心返回我
/zk/dc1
/zk/dc2
/zk/dc3

而且,如果我只需要得到我所在的数据中心,那么它也应该能够以这种方式工作

public static void main(String[] args) {
        System.out.println(DatacenterEnum.getCurrentDatacenter());
}

public enum DatacenterEnum {

    DEV, DC1, DC2, DC3;

    public static String forCode(int code) {
    return (code >= 0 && code < values().length) ? values()[code].name() : null;
    }

    private static final DatacenterEnum ourlocation = compareLocation();

    private static DatacenterEnum compareLocation() {
    String ourhost = getHostName();
    for (DatacenterEnum dc : values()) {
        String namepart = "." + dc.name().toLowerCase() + ".";
        if (ourhost.indexOf(namepart) >= 0) {
        return dc;
        }
    }
    return null;
    }

    private static final String getHostName() {
    try {
        return InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
    } catch (UnknownHostException e) {      
        //log error
    }
    return null;
    }

    public static DatacenterEnum getCurrentDatacenter() {
    return ourlocation;
    }       
}
publicstaticvoidmain(字符串[]args){
System.out.println(DatacenterEnum.getCurrentDatacenter());
}
公共枚举数据中心枚举{
DEV,DC1,DC2,DC3;
公共静态字符串forCode(整型代码){
返回(代码>=0&&code=0){
返回dc;
}
}
返回null;
}
私有静态最终字符串getHostName(){
试一试{
返回InetAddress.getLocalHost().getCanonicalHostName().toLowerCase();
}捕获(未知后异常e){
//日志错误
}
返回null;
}
公共静态数据中心枚举getCurrentDatacenter(){
返回我们的位置;
}       
}

你知道如何有效地完成吗?

谢谢你的建议。在这种情况下,这里的名称是什么?抱歉,当前弄错了?name()是枚举的名称,即“DC1”、“DC2”、“DC3”或“DEV”。每个枚举都有一个:是的,但这个名称将是我所在的当前数据中心的名称,对吗?你至少试过理解我发布的6行代码吗?方法是在我们的位置调用的,对吗?我们的位置就是我们的位置,对吗?@JaceRhea:同意。但是我没有看到任何需要解释的东西,对于已经使用Enum、已经使用toLowercase()的人来说,应该知道我们的位置是什么,因为他已经定义了它,并且应该理解Random.nextBoolean()在没有任何解释的情况下做了什么。我喜欢你想要一些包括DNS查找在内的高效的东西!还要考虑如果你的网络管理员改变DNS或者移动你的程序,你是否会默默地接受你的程序。将配置置于代码之外。属性文件的读取成本很低。这只是一个坏主意——整个命名过程。
private void toZkString() {
    if (this == DEV) {
        return new Random().nextBoolean() ? "/zk/dc1" : "/zk/dc2";
    }
    return "/zk/" + name().toLowercase();
}

private static final String OUR_LOCATION_AS_ZK_STRING = ourlocation.toZkString();