Liberty for Java上Proxy的实现

时间:2015-11-12 06:47:31

标签: ibm-cloud websphere-liberty devops

我在Bluemix上使用“Liberty for Java”应用程序和Statica服务(代理)。 我们在每个事务的Java代码中将http.proxyHost/http.proxyPort/https.proxyHost/https.proxyPort设置为系统属性。

例如:

URL url = new URL(xxx);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
........
System.setProperty("http.proxyHost", host);
System.setProperty("http.proxyPort", port);
System.setProperty("https.proxyHost", host);
System.setProperty("https.proxyPort", port);
........
DataOutputStream out = new DataOutputStream(connection.getOutputStream());

我遇到一个问题,即尽管有成千上万的交易通过了代理,但是一个事务直接从应用程序转移到目标服务器。

问题1: Bluemix上的“Liberty for Java”应用程序是否清除或更新系统属性http.proxyHost/http.proxyPort/https.proxyHost/https.proxyPort? 我想知道“Liberty for Java”应用程序用null更新以访问多线程环境中的外部服务器。

问题2: Bluemix上的“Liberty for Java”应用程序是否与外部服务器通信? 我在Statica中找到了以下日志。

https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.agents.na.apm.ibmserviceengage.com
https://xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.gateway.prd.na.ca.ibmserviceengage.com

(我屏蔽了网址的一部分。)

P.S。我们将使用ProxySelector类或Proxy类更改java代码。

1 个答案:

答案 0 :(得分:1)

回复#1:否。

Re#2:可能是的。在您的情况下,您的应用程序似乎与监控&分析服务?如果是这样,将安装数据收集器并将收集的数据发送到远程服务器。

您需要在代码中设置代理系统属性的原因是什么?是因为你想要一些连接通过代理而其他连接没有?

如果是这样,那么执行此操作的方式不正确,因为系统代理设置是全局设置,而不是线程范围设置。这意味着如果一个线程设置代理设置,则所有线程将使用该代理;如果一个线程取消设置,则所有线程将进行直接连接。这可以解释为什么你间歇性地看到一些直接联系。正确的方法是使用支持代理作为参数的http客户端库,如https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/config/RequestConfig.Builder.html#setProxy%28org.apache.http.HttpHost%29

如果您希望所有连接都通过http代理,那么您应该只设置JAVA_OPTS环境变量以传入这些系统属性,例如," -Dhttp.proxyHost = xxxx -Dhttp.proxyPort = xx&# 34。