如何在JVM&amp ;;中为加载服务器应用程序设置指定代理Jboss的?

时间:2013-03-19 00:15:51

标签: java jboss proxy jvm

我有一个加载服务器应用程序,可在两个应用程序之间切换,App1&应用2。每个应用程序都有自己的IFrame与银行对话,但当银行返回数据时,加载服务器无法区分哪个应用程序。我对此进行了调查,然后我发现它是代理问题。

因此,我试图强制该应用程序使用proxyHost& proxyport但它没有用,然后我强迫Jboss使用特定的proxyHost& proxyport但它也没有用。它在盒子上使用默认代理,它不关心我的配置。

设置proxyHost& Jboss启动脚本proxyPort上的bin\run.bat: Jboss日志显示它在我们运行时接受了java VM参数(例如-Dhttp.proxyHost=XX.XX.XX.XX -Dhttp.proxyPort=8080) 在应用程序中,它仍然会通过框中的默认代理设置。

我在google& stackoverflow并尝试了不同的想法,但没有奏效。 有人可以对此有所了解吗?

2 个答案:

答案 0 :(得分:0)

您是否可以尝试使用以下JVM args运行您的应用:-Dsun.net.inetaddr.ttl=0 -Dnetworkaddress.cache.ttl=0

成功请求后,DNS设置会被缓存,这些参数将禁用缓存。

答案 1 :(得分:0)

您可以强制应用程序忽略proxyHost和的任何VM参数 只需使用它正在运行的框的默认代理。你可以编写一个小的java程序,只打印默认代理并在特定的框中运行它(如下所示):

import java.net.InetSocketAddress;
import java.net.ProxySelector;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.List;

import java.net.URI;

public class PrintDefaultProxy {
    public static void main(String[] args) {

        // If you clear these 2 properties then set java.net.useSystemProxies to true, it 
        // will use the default System Proxy and ignore any settings given to the VM
        // e.g. http.proxyHost & http.proxyPort
        System.setProperty("http.proxyHost", "");
        System.setProperty("http.proxyPort", "");

        System.setProperty("java.net.useSystemProxies", "true");
        System.out.println("detecting proxies");
        List l = null;
        try {
            String url = "http://google.com.au/";
            l = ProxySelector.getDefault().select(new URI(url));
        } 
        catch (URISyntaxException e) {
            e.printStackTrace();
        }
        if (l != null) {
            for (Iterator iter = l.iterator(); iter.hasNext();) {
                java.net.Proxy proxy = (java.net.Proxy) iter.next();
                System.out.println("proxy Type : " + proxy.type());

                InetSocketAddress addr = (InetSocketAddress) proxy.address();

                if (addr == null) {
                    System.out.println("No Proxy");
                } else {
                    System.out.println("proxy hostname : " + addr.getHostName());
                    System.setProperty("http.proxyHost", addr.getHostName());
                    System.out.println("proxy port : " + addr.getPort());
                    System.setProperty("http.proxyPort", Integer.toString(addr.getPort()));
                }
            }
        }
    }
}

基本上在代码中,如果清除http.proxyHost和http.proxyPort然后将java.net.useSystemProxies设置为true,它将使用 系统默认代理(如果有)并忽略任何VM参数。

System.setProperty("http.proxyHost", "");
System.setProperty("http.proxyPort", "");

System.setProperty("java.net.useSystemProxies", "true");
System.out.println("detecting proxies");

然后你在你的盒子上运行它并传递了一些虚假的代理地址:

C:\t>"C:\Program Files\Java\jdk1.6.0_19\bin\java.exe" -Dhttp.proxyHost=99.0.0.99.9 -Dhttp.proxyPort=8080  PrintDefaultProxy
detecting proxies
proxy Type : DIRECT
No Proxy

注意,如果你不清除这两个属性,它将使用你传递给JVM的参数 - 但据我所知,它不是你的应用程序似乎在做什么。这是一种应用程序应该“正常工作”而不必专门设置proxyHost的方式 - 这很可能是为什么它忽略了你在JVM / Jboss级别提供的任何设置。

如果行为与您尝试在Jboss中更改这些设置的行为一致,则意味着您无法在应用程序或Jboss级别配置它以使用proxyHost,并且很可能需要在网络上完成水平。