0

我为 POC 创建了一个示例 Web 应用程序。此应用程序在 Amazon 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]

  [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。

4

1 回答 1

0

据我了解,这些代理系统属性适用于 JDK 提供的 HTTP 连接类——比如 HttpUrlConnection。根据您使用的 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 客户端示例页面

这里还有其他示例(包括代理身份验证): https ://hc.apache.org/httpcomponents-client-ga/examples.html

希望这会有所帮助,安迪

于 2017-11-16T05:23:04.810 回答