3

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

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

有人有更多建议吗?

(注意:这是对必须确定为“非开发”相关的先前帖子的重述......)

TIA

4

3 回答 3

3

这取决于 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

于 2013-08-07T02:27:55.277 回答
1

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

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

Web 服务器(例如Tomcat)可能会在启动时安装一个安全管理器,在这种情况下,JVM(至少我已经提到的那些)将默认永久缓存积极的查找。

于 2016-05-13T16:15:51.577 回答
1

您需要从 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();
}
于 2017-02-07T10:53:11.143 回答