我为POC创建了一个示例web应用程序。此应用程序在亚马逊EC2 liberty 17.0.0.2中运行。如下所示,当我们向servlet发送get请求时,它必须向AWS SQS发送消息。
http://localhost:8080/TestSqsWeb/SqsServlet?message=Hello333
我们的EC2是协作式EC2,它需要代理才能连接到互联网。因此,我在liberty的jvm.options文件中提供了代理配置。
-Dhttps.nonProxyHosts=169.254.169.254|localhost|127.0.0.1
-Dhttp.nonProxyHosts=169.254.169.254|localhost|127.0.0.1
-Dhttp.proxyHost=proxy.ebiz.abc.com
-Dhttp.proxyPort=80
-Dhttps.proxyHost=proxy.ebiz.abc.com
-Dhttps.proxyPort=80 它一直在给下面的例外。
org.apache.http.conn.ConnectTimeoutException: Connect to sqs.us-west-2.amazonaws.com:443 [sqs.us-west-2.amazonaws.com/52.119.168.22] failed: connect timed out经过进一步的分析,我发现它在建立连接时没有获取代理系统属性。我用System.getProperty打印了代码中的所有系统属性。它会打印我的系统属性,这意味着配置是正确的。
为了进一步分析,我在tomcat-8中使用相同的代理配置在相同的EC2中部署了相同的应用程序,它正在工作。它能够建立连接并将我的消息发送到AWS SQS队列。
在此分析之后,我得出结论,在自由中存在一些问题。
我的示例应用程序中的库
[1]: https://i.stack.imgur.com/K2gbj.png在我发现的一篇文章中,它可能是由于旧版本的http-client造成的,但我使用的是最新的httpclient-4.5.2.jar和httpcore-4.4.4.jar,正如你在上面的链接中看到的那样。
是否有人遇到过Liberty 17.0.0.2/17.0.0.3的相同问题?我使用的是IBM JAVA SDK-8。
发布于 2017-11-16 13:23:05
据我所知,这些代理系统属性适用于类似JDK的HttpUrlConnection提供的HTTP connection类。根据您使用的Apache HTTP客户端,它可能不会使用这些API。
与使用JDK提供的系统属性不同,您可能希望修改代码,如下所示:
public static void main(String[] args)throws Exception {
CloseableHttpClient httpclient = HttpClients.createDefault();
try {
HttpHost target = new HttpHost("httpbin.org", 443, "https");
HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");
RequestConfig config = RequestConfig.custom()
.setProxy(proxy)
.build();
HttpGet request = new HttpGet("/");
request.setConfig(config);
...此代码示例取自Apache HTTP Client examples page。
这里还有其他示例(包括代理身份验证):https://hc.apache.org/httpcomponents-client-ga/examples.html
希望这能帮上忙,安迪
https://stackoverflow.com/questions/47316063
复制相似问题