从JAVA刷新Linux DNS

时间:2013-08-06 16:02:44

标签: linux dns cloud

我们有一个RC模块,在热部署期间会被放入我们的云服务器中。为此,我需要一种从JAVA中以编程方式刷新DNS的方法。我能想到的最好的解决方案是让java启动一个外部shell脚本,但是我没有运气。我尝试了“正常”程序:

1)重新启动nscd服务(未安装在这些服务器中)
2)/etc/init.d/networking restart(无效)
3)/etc/init.d/dns-clean start(无效)

有人有任何建议吗?

(注意:这是前一篇文章的重新定义,必须确定为“非开发”相关...)

TIA

3 个答案:

答案 0 :(得分:2)

这是依赖于JVM的实现。在Oracle JDK上,您需要设置networkaddress.cache.ttlnetworkaddress.cache.negative.ttl 安全属性(在$JAVA_HOME/lib/security/java.security中)。出厂默认设置是永久缓存正答案。

AFAIK无法在运行时刷新缓存。

请参阅http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

答案 1 :(得分:0)

自Java 6(Sun / Apple)和Java 7+(OpenJDK)以来,networkaddress.cache.ttl的默认值为 30秒(在sun.net.InetAddressCachePolicy中指定),假设有没有安装安全管理器(通过-Djava.security.managerSystem.setSecurityManager)。

同时,networkaddress.cache.negative.ttl的默认值 10秒(在$JRE_HOME/lib/security/java.security中指定)。

Web服务器(例如Tomcat)可以在启动时安装安全管理器,在这种情况下,JVM(至少我提到的那些)将永久地缓存正向查找by default

答案 2 :(得分:0)

您需要从Java本地调用(JNI)res_init():

ResInitLoader.java

package my.pkg;
public class ResInitLoader {
    static {
            System.loadLibrary("ResInit");
    }
    public static native int resInit();
}

ResInit.c

#include <resolv.h>
JNIEXPORT jint JNICALL Java_my_pkg_ResInitLoader_resInit (JNIEnv *env, jclass clazz) {
   return res_init();
}