【问题标题】:Flushing linux DNS from JAVA从 JAVA 刷新 linux DNS
【发布时间】:2013-08-07 18:00:13
【问题描述】:

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

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

大家还有什么建议吗?

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

TIA

【问题讨论】:

    标签: linux dns cloud


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢威尔。看起来我无法完全实现我想要做的事情,但你指出的设置应该给我更多的回旋余地来进行实验。
    【解决方案2】:

    从 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

    【讨论】:

      【解决方案3】:

      您需要从 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();
      }
      

      【讨论】:

        猜你喜欢
        • 2011-01-07
        • 1970-01-01
        • 1970-01-01
        • 2013-03-16
        • 2015-04-22
        • 2013-12-31
        • 1970-01-01
        • 2011-03-14
        • 2016-10-31
        相关资源
        最近更新 更多