如何更改“ http.connection-manager.timeout”?

时间:2019-01-10 15:35:02

标签: java eclipse http service axis2

基本上,我正在使用Apache Axis2。使用它,我可以更改所需的任何超时,但是没有标题的超时。我正在使用Java和Eclipse。

我有一个项目,我们正在测试一些Web服务。在它上面,我正在使用 ServiceClient Options 实施测试,更改其具有的超时属性。

但是,我可以更改以下3个超时参数中的2个: -http.connection-manager.timeout(无法更改)。 -http.connection.timeout(可以更改)。 -http.socket.timeout(可以更改)。

我尝试了很多方法来尝试更改第一个,但我还没有找到如何做的方法。

如下所示,“ 600000 ”值是我可以更改的字段,而“ 30000”是我不能更改的字段(我认为默认值为30000)。

我将向您展示我正在处理的部分代码以及控制台输出。


[CODE]

int timeoutMS = 600000;

ServiceClient serviceClient = stub._getServiceClient();

Options options = serviceClient.getOptions();

options.setTimeOutInMilliSeconds(timeoutMS); options.setProperty(HTTPConstants.SO_TIMEOUT, timeoutMS); options.setProperty(HTTPConstants.CONNECTION_TIMEOUT, timeoutMS);

[控制台输出]

[DEBUG 2019/01/10 16:15:15,236] Set parameter http.connection-manager.timeout = 30000

[DEBUG 2019/01/10 16:15:15,237] Set parameter http.connection.timeout = 600000

[DEBUG 2019/01/10 16:15:15,237] Set parameter http.socket.timeout = 600000


如您所见,我的预期结果是三个参数的值均为“ 600000”,但第一个参数默认保留该值。

谢谢!

1 个答案:

答案 0 :(得分:0)

我在工作中偶然发现了同样的问题。经过几个小时的研究,我们终于找到了该解决方案的近似值。这是我们得到的:

MultiThreadedHttpConnectionManager connectionManager;
void configureCachedHttpClient() {
        connectionManager = new MultiThreadedHttpConnectionManager();
        HttpConnectionManagerParams params = connectionManager.getParams();
        params.setConnectionTimeout(timeout); // set connection timeout (how long it takes to connect to remote host)
        params.setSoTimeout(timeout); // set socket timeout (how long it takes to retrieve data from remote host)
        params.setDefaultMaxConnectionsPerHost(maxTotalConnections);
        params.setMaxTotalConnections(maxTotalConnections);

        HttpClient httpClient = null;
        try {
            httpClient = new HttpClient(connectionManager);
            HttpConnectionManagerParams connectionManagerParams = httpClient.getHttpConnectionManager().getParams();
            connectionManagerParams.setParameter("http.connection-manager.timeout", timeout); // set timeout on how long we'll wait for a connection from the pool

            context.setProperty(HTTPConstants.MULTITHREAD_HTTP_CONNECTION_MANAGER, connectionManager);
            context.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);
            context.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, true);
            // context.setProperty(HTTPConstants.AUTO_RELEASE_CONNECTION, true);
        } catch (Exception e) {
            // Exception e
            httpClient = null;
            e.printStackTrace();
        } finally {
            httpClient = null;
        }
    }

正如您所陈述的那样,上述代码段中的行需要更改'http.connection-manager.timeout'属性。必须实例化“ org.apache.commons.httpclient.MultiThreadedHttpConnectionManager”,并初始化一个“ org.apache.commons.httpclient.HttpClient”对象,以便对其进行进一步配置。设置完所需的设置后,我们必须设置最后3个属性,如下所示。

在配置和设置它之后,Axis将使用我们在最后设置的那个httpclient实例;因此,到Web服务的每个新连接/通信都将按照所述进行预配置。

希望这可以为您提供帮助;如果还不够完善,我感到抱歉。 如果需要,将完成此答案。

[编辑]

正如您所显示的,以下是我们的日志的摘录:

...
[DEBUG 2019/01/22 17:42:30.719] Set parameter http.connection.timeout = 120000
[DEBUG 2019/01/22 17:42:30.719] Set parameter http.socket.timeout = 120000
[DEBUG 2019/01/22 17:42:30.719] Set parameter http.connection-manager.max-per-host = {HostConfiguration[]=2}
[DEBUG 2019/01/22 17:42:30.719] Set parameter http.connection-manager.max-total = 2
[DEBUG 2019/01/22 17:42:31.597] Set parameter http.connection-manager.timeout = 120000
...