我有一个在JVM / Tomcat上运行的应用程序,并且它运行的所有机器都启用了IPv6堆栈。我正在尝试向另一台仅支持IPv4的计算机发出请求,而JVM总是更喜欢使用IPv6堆栈来发出此请求(我正在使用Apache HttpClient
类来发出请求。)
我知道-Djava.net.preferIPv4Stack=true
属性,但由于我不会在这里讨论的原因,我无法在JVM启动时传递它。我甚至无法以编程方式(在很短的时间内)设置它:
System.setProperty("java.net.preferIPv4Stack", "true");
...因为这可能会影响在JVM / Tomcat实例上运行的其他线程(正如我从this question和其他人那样了解)。
所以问题是,如何让这个单一请求通过IPv4堆栈(意味着实际使用IPv4接口,而不仅仅是连接到IPv4端点)?
我考虑过使用cURL(通过exec或通过libcurl绑定),因为curl根本不使用JVM。
还有其他想法吗?
答案 0 :(得分:1)
Flexo提到这是有效的!
最终我意识到真正的问题不是JVM会将请求形成IPv6接口,这是不可能的,因为代理只会有一个A DNS条目(正如Flexo指出的那样)。
真正的问题是代理URL中的拼写错误,这使得JVM无法解析代理主机;让我失望的是从Inet6Address类抛出异常的事实(可能是因为JVM还不知道代理只是IPv4的事实)。
我修正了错字!现在代理已正确解析,请求通过IPv4进行。谢谢!