我们有一个RC模块,在热部署期间会被放入我们的云服务器中。为此,我需要一种从JAVA中以编程方式刷新DNS的方法。我能想到的最好的解决方案是让java启动一个外部shell脚本,但是我没有运气。我尝试了“正常”程序:
1)重新启动nscd服务(未安装在这些服务器中)
2)/etc/init.d/networking restart(无效)
3)/etc/init.d/dns-clean start(无效)
有人有任何建议吗?
(注意:这是前一篇文章的重新定义,必须确定为“非开发”相关...)
TIA
答案 0 :(得分:2)
这是依赖于JVM的实现。在Oracle JDK上,您需要设置networkaddress.cache.ttl
和networkaddress.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.manager
或System.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();
}