Jakob Furrer created SOLR-6542: ---------------------------------- Summary: 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.10, 4.9 Reporter: Jakob Furrer Priority: Minor
I try to get a HttpSolrServer object with the following non-standard functionalities: a) a proxy is used for the connection b) 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() 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) 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 listing [1]: * * 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:8060/FTS-Index/WebOffice"; 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 listing [2]: * * 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:8060/FTS-Index/WebOffice"; 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(); } -- This message was sent by Atlassian JIRA (v6.3.4#6332) --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@lucene.apache.org For additional commands, e-mail: dev-h...@lucene.apache.org