[ 
https://issues.apache.org/jira/browse/SOLR-6542?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Shawn Heisey closed SOLR-6542.
------------------------------
    Resolution: Invalid

The exception encountered is exactly what I believe should happen with the code 
as it is written.  The correct method of setting timeouts has been mentioned in 
a comment.

> Method setConnectionTimeout throws Exception when using HttpSolrServer with a 
> proxy
> -----------------------------------------------------------------------------------
>
>                 Key: SOLR-6542
>                 URL: https://issues.apache.org/jira/browse/SOLR-6542
>             Project: Solr
>          Issue Type: Bug
>          Components: clients - java
>    Affects Versions: 4.9, 4.10
>            Reporter: Jakob Furrer
>            Priority: Minor
>
> I try to get a HttpSolrServer object with the following non-standard 
> functionalities:
> * a proxy is used for the connection
> * the connection timeout is set
> A HttpClient object is required for setting proxy (see code listing 1).
> The timeout can either be defined on the internal httpClient object (see 
> option a) or later on the created httpSolrServer object (see option b)
> Question one:
> _Is there a difference in behaviour of the HttpSolrServer instance when I set 
> the connection timeout directly in my own HttpClient object in comparison to 
> using the method HttpSolrServer#setConnectionTimeout() ?_
> I would expect that there is no difference.
> Moving from Solr 4.6 to Solr 4.9, I also upgraded HttpClient to the same 
> Version Solr is using (httpclient-4.2.6 was used in solr-4.6, now 
> httpclient-4.3.1 is used in solr-4.9).
> The newer version of HttpSolr deprecates a number of methods used in my code, 
> therefore I was looking for a way to modify it according to the new API (see 
> code listing 2).
> I now get an java.lang.UnsupportedOperationException when using the method 
> HttpSolrServer#setConnectionTimeout() 
> {noformat}
> java.lang.UnsupportedOperationException
>       at 
> org.apache.http.impl.client.InternalHttpClient.getParams(InternalHttpClient.java:204)
>       at 
> org.apache.solr.client.solrj.impl.HttpClientUtil.setConnectionTimeout(HttpClientUtil.java:249)
>       at 
> org.apache.solr.client.solrj.impl.HttpSolrServer.setConnectionTimeout(HttpSolrServer.java:634)
>       at 
> test.HttpSolrServerTest.newStyle_httpclient_4_3_1(HttpSolrServerTest.java:89)
> {noformat}
> It seems that since the switch of the library HttpClient something internally 
> clashes in the HttpSolrServer object.
> Question two:
> _Is this something that has been overlooked when the library within SolrJ was 
> changed to the newer version, or am trying something that must not be done?_
> I would expect that the method HttpSolrServer#setConnectionTimeout() can be 
> used, independent of the way I chose to create that object.
> Bonus question:
> _Am I using an acceptable way of accessing Solr over a proxy or are there 
> better methods?_
> {code:title=code listing 1|borderStyle=solid}
>       /**
>        * requires the following libraries to run
>        *     httpclient-4.2.6.jar
>        *     httpcore-4.2.5.jar
>        *     solr-solrj-4.6.0.jar
>        *
>        *     --> shows lots of deprecated methods when using 
> httpclient-4.3.1.jar
>        */
>       @Test
>       public void oldStyle_httpclient_4_2_6() throws Exception {
>               String solrUrlForPing = 
> "http://localhost:8983/solr/collection1";;
>               String proxyHost = "127.0.0.1";
>               int proxyPort = 8888; // Using "Fiddler" as dummy proxy
>               int maxTimeout = 10000; // 10 seconds
>               final HttpParams httpParams = new BasicHttpParams();
>               // option a) timeout can be set as a parameter of the httpClient
>               HttpConnectionParams.setConnectionTimeout(httpParams, 
> maxTimeout);
>               HttpConnectionParams.setSoTimeout(httpParams, maxTimeout);
>               ClientConnectionManager connMgr = new 
> PoolingClientConnectionManager();
>               HttpClient httpClient = new DefaultHttpClient(connMgr, 
> httpParams);
>               HttpHost httpProxy = new HttpHost(proxyHost, proxyPort);
>               
> httpClient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, httpProxy);
>               HttpSolrServer httpSolrServer = new 
> HttpSolrServer(solrUrlForPing, httpClient);
>               // option b) timeout can be set on the httpSolrServer object
>               httpSolrServer.setConnectionTimeout(maxTimeout);
>               httpSolrServer.setSoTimeout(maxTimeout);
>               httpSolrServer.ping();
>       }
> {code}
> {code:title=code listing 2|borderStyle=solid}
>       /**
>        * requires the following libraries to run
>        *     httpclient-4.3.1.jar
>        *     httpcore-4.3.jar
>        *     solr-solrj-4.9.0.jar
>        */
>       @Test
>       public void newStyle_httpclient_4_3_1() throws Exception {
>               String solrUrlForPing = 
> "http://localhost:8983/solr/collection1";;
>               String proxyHost = "127.0.0.1";
>               int proxyPort = 8888; // Using "Fiddler" as dummy proxy
>               int maxTimeout = 10000; // 10 seconds
>               HttpClientBuilder hcBuilder = HttpClients.custom();
>               // setting the maximum allowed timeout
>               RequestConfig config = RequestConfig.custom()
>                                       .setSocketTimeout(maxTimeout)
>                                       .setConnectTimeout(maxTimeout)
>                                       .build();
>               hcBuilder.setDefaultRequestConfig(config);
>               HttpHost httpProxy = new HttpHost(proxyHost, proxyPort);
>               DefaultProxyRoutePlanner routePlanner = new 
> DefaultProxyRoutePlanner(httpProxy);
>               hcBuilder.setRoutePlanner(routePlanner);
>               HttpClient httpClient = hcBuilder.build();
>               HttpSolrServer httpSolrServer = new 
> HttpSolrServer(solrUrlForPing, httpClient);
>               // option b) timeout can be set on the httpSolrServer object
>               httpSolrServer.setConnectionTimeout(maxTimeout);   // --> 
> THROWS java.lang.UnsupportedOperationException
>               httpSolrServer.setSoTimeout(maxTimeout);           // --> 
> THROWS java.lang.UnsupportedOperationException
>               httpSolrServer.ping();
>       }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to