2013-08-06 40 views
0

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

1)启动nscd服务(不安装在这些服务器)
2)参考/etc/init.d/networking重启(无效果)
3) /etc/init.d/dns-clean start(无效)

任何人有更多的建议吗?

(注:这是一个以前的帖子必须已被确定为“不发展” ...的相关的再字)

TIA

回答

1

这是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

+0

感谢威尔。它看起来并不像我想要做的那样,但是你指出的设置应该给我更多的回旋空间来尝试。 – mjk

0

由于Java 6(太阳/苹果)和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

0

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

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(); 
}