org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V 错误的解决办法

本文详细记录了在Solr升级过程中遇到的“org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V”错误及其解决办法。通过升级SolrJ和HttpClient至兼容版本,成功解决了单元测试模块不通过的问题。

 

问题概述

根据要求对Solr进行升级,各个配置升级改操到位后,启动项目时,单元测试模块不通过,导致项目一直无法启动,错误信息:“ org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V

 

升级的服务版本如下图所示:

 

部分截图如下:

控制台打印:

2019-08-02 10:32:53,668 [main] [org.apache.solr.client.solrj.impl.HttpClientUtil]-[DEBUG] Creating new http client, config:followRedirects=false&allowCompression=false

具体的错误信息如下:

java.lang.NoSuchMethodError: org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:279)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:330)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:268)
	at org.apache.solr.client.solrj.impl.HttpClientUtil.createClient(HttpClientUtil.java:255)
	at org.apache.solr.client.solrj.impl.HttpSolrClient.<init>(HttpSolrClient.java:201)
	at org.apache.solr.client.solrj.impl.HttpSolrClient$Builder.build(HttpSolrClient.java:943)
	at com.huazai.b2c.aiyou.test.solrj.TSolrjClient.addDocument(TSolrjClient.java:37)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:497)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)

 

 

解决办法

经过了几天的摸排,因为这个问题有点独特,网上基本上没有看到参考资料,然后就是从系统日志、到官方文档,还是没有头绪,最后通过控制台输出的日志,初步判定,为 HttpClientUtiil 包不兼容的问题,为什么要作出这样的判定呢,因为一般对老版本的系统进行升级改操的时候,最让人头痛的一个问题就是面临各种的不兼容的问题(需要根据个人经验来判定);

从异常信息的第二行看,随初步判断为 HttpClientUtil 包不兼容的问题,将HttpClientUtil和SolrJ进行对称升级操作:

			<dependency>
				<groupId>org.apache.solr</groupId>
				<artifactId>solr-solrj</artifactId>
				<version>8.2.0</version>
			</dependency>
			<dependency>
				<groupId>org.apache.httpcomponents</groupId>
				<artifactId>httpclient</artifactId>
				<version>4.5.9</version>
			</dependency>

后来从其依赖体系关系中摸查了哈,果不其然为 HttpClient 包的兼容问题导致的,如下图:

解决后再次请求:

 

 

 

 


 好了,关于 org.apache.http.impl.conn.PoolingHttpClientConnectionManager.setValidateAfterInactivity(I)V 错误的解决办法 就写到这儿了,如果还有什么疑问或遇到什么问题欢迎扫码提问,也可以给我留言哦,我会一一详细的解答的。 
歇后语:“ 共同学习,共同进步 ”,也希望大家多多关注CSND的IT社区。


作       者:华    仔
联系作者:who.seek.me@java98k.vip
来        源:优快云 (Chinese Software Developer Network)
原        文:https://blog.youkuaiyun.com/Hello_World_QWP/article/details/98179570
版权声明:本文为博主原创文章,请在转载时务必注明博文出处!
/* * Copyright (c) Huawei Technologies Co., Ltd. 2019-2019. All rights reserved. */ package com.huawei.peripheral.servicecall.Utils; import org.apache.commons.lang3.StringUtils; import org.apache.http.Consts; import org.apache.http.Header; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.CookieStore; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.config.AuthSchemes; import org.apache.http.client.config.CookieSpecs; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpDelete; import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPatch; import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPut; import org.apache.http.client.methods.HttpRequestBase; import org.apache.http.config.ConnectionConfig; import org.apache.http.config.MessageConstraints; import org.apache.http.config.Registry; import org.apache.http.config.RegistryBuilder; import org.apache.http.config.SocketConfig; import org.apache.http.conn.DnsResolver; import org.apache.http.conn.HttpConnectionFactory; import org.apache.http.conn.ManagedHttpClientConnection; import org.apache.http.conn.routing.HttpRoute; import org.apache.http.conn.socket.ConnectionSocketFactory; import org.apache.http.conn.socket.PlainConnectionSocketFactory; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.entity.ContentType; import org.apache.http.entity.StringEntity; import org.apache.http.impl.DefaultHttpResponseFactory; import org.apache.http.impl.client.BasicCookieStore; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.DefaultHttpResponseParser; import org.apache.http.impl.conn.DefaultHttpResponseParserFactory; import org.apache.http.impl.conn.ManagedHttpClientConnectionFactory; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.impl.conn.SystemDefaultDnsResolver; import org.apache.http.impl.io.DefaultHttpRequestWriterFactory; import org.apache.http.io.HttpMessageParser; import org.apache.http.io.HttpMessageParserFactory; import org.apache.http.io.HttpMessageWriterFactory; import org.apache.http.io.SessionInputBuffer; import org.apache.http.message.BasicHeader; import org.apache.http.message.BasicLineParser; import org.apache.http.message.LineParser; import org.apache.http.util.CharArrayBuffer; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.net.ssl.SSLContext; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.CodingErrorAction; import java.security.KeyManagementException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** * 功能描述 HttpUtil * * @since 2019-09-03 */ @Configuration public class HttpUtil { /** * APPLICATION_JSON */ public static final String APPLICATION_JSON = "application/json"; /** * 字符串格式 */ public static final String UTF8 = "utf-8"; @Value("${httpclient.max.pool}") public int maxPool; @Value("${httpclient.max.perroute}") public int maxPerRoute; @Value("${httpclient.connect.timeout}") public int connectTimeOut; @Value("${httpclient.socket.timeout}") public int socketTimeOut; @Value("${httpclient.connection.request.timeout}") public int connectionRequestTimeOut; /** * 单例 */ //public static final HttpUtil INSTANCE = new HttpUtil(); private static Logger logger = LoggerFactory.getLogger(HttpUtil.class); // HTTP Get请求(POST雷同) //RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000).build(); //private CloseableHttpClient httpClient; @Bean public CloseableHttpClient getHttpUtilClient(){ PoolingHttpClientConnectionManager connManager = getClientConnectionManager(); SocketConfig socketConfig = SocketConfig.custom().setTcpNoDelay(true).build(); connManager.setDefaultSocketConfig(socketConfig); connManager.setValidateAfterInactivity(1000); MessageConstraints messageConstraints = MessageConstraints.custom().setMaxHeaderCount(200).setMaxLineLength(2000).build(); ConnectionConfig connectionConfig = ConnectionConfig.custom() .setMalformedInputAction(CodingErrorAction.IGNORE) .setUnmappableInputAction(CodingErrorAction.IGNORE) .setCharset(Consts.UTF_8) .setMessageConstraints(messageConstraints) .build(); connManager.setDefaultConnectionConfig(connectionConfig); connManager.setMaxTotal(maxPool); connManager.setDefaultMaxPerRoute(maxPerRoute); CookieStore cookieStore = new BasicCookieStore(); CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); RequestConfig defaultRequestConfig = RequestConfig.custom() .setCookieSpec(CookieSpecs.DEFAULT) .setExpectContinueEnabled(true) .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST)) .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)) .setConnectTimeout(connectTimeOut) .setSocketTimeout(socketTimeOut) .setConnectionRequestTimeout(connectionRequestTimeOut) .build(); HttpClientBuilder builder = HttpClients.custom().setConnectionManager(connManager); builder.setDefaultCookieStore(cookieStore); builder.setDefaultCredentialsProvider(credentialsProvider); builder.setDefaultRequestConfig(defaultRequestConfig); // 创建自定义的httpclient对象 //httpClient = builder.build(); return builder.build(); } /** * 项目报文格式转换工厂 * * @return responseParserFactory */ private HttpMessageParserFactory<HttpResponse> getResponseParserFactory() { HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() { @Override public HttpMessageParser<HttpResponse> create(SessionInputBuffer buffer, MessageConstraints constraints) { LineParser lineParser = new BasicLineParser() { @Override public Header parseHeader(CharArrayBuffer buffer) { try { return super.parseHeader(buffer); } catch (Exception ex) { return new BasicHeader(buffer.toString(), ""); } } }; return new DefaultHttpResponseParser(buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) { @Override protected boolean reject(CharArrayBuffer line, int count) { // try to ignore all garbage preceding a status line // infinitely return false; } }; } }; return responseParserFactory; } private PoolingHttpClientConnectionManager getClientConnectionManager() { HttpMessageParserFactory<HttpResponse> responseParserFactory = getResponseParserFactory(); HttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory(); HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(requestWriterFactory, responseParserFactory); // 采用绕过验证的方式处理https请求 SSLContext sslcontext = null; try { sslcontext = SSLContextUtil.createIgnoreVerifySSL(); } catch (NoSuchAlgorithmException e) { System.out.println("init exception......"); } catch (KeyManagementException e) { System.out.println("init exception......"); } Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() .register("http", PlainConnectionSocketFactory.INSTANCE) .register("https", new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER)) .build(); DnsResolver dnsResolver = new SystemDefaultDnsResolver() { @Override public InetAddress[] resolve(String host) throws UnknownHostException { if ("myhost".equalsIgnoreCase(host)) { return new InetAddress[]{InetAddress.getByAddress(new byte[]{127, 0, 0, 1})}; } else { return super.resolve(host); } } }; PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry, connFactory, dnsResolver); return connManager; } /** * sendGetReq * * @param url url * @param header header * @param param param * @return HttpResp */ public HttpResp sendGetReq(String url, Map<String, String> header, Map<String, Object> param) { HttpGet httpget = new HttpGet(buildGetUrl(url, param)); // 设置请求和传输超时时间 //httpget.setConfig(requestConfig); return sendReq(httpget, header); } /** * sendGetReq * * @param url url * @param header header * @return HttpResp */ public HttpResp sendGetReq(String url, Map<String, String> header) { HttpGet httpget = new HttpGet(url); // 设置请求和传输超时时间 //httpget.setConfig(requestConfig); return sendReq(httpget, header); } /** * sendPostReq * * @param url url * @param header header * @param jsonParams jsonParams * @return HttpResp */ public HttpResp sendPostReq(String url, Map<String, String> header, String jsonParams) { HttpPost httpPost = new HttpPost(url); // 设置请求和传输超时时间 //httpPost.setConfig(requestConfig); return sendJsonReq(httpPost, header, jsonParams); } /** * 设置post请求超时时间 * * @param url url * @param header header * @param jsonParams jsonParams * @param second second * @return HttpResp */ public HttpResp sendPostReqLong(String url, Map<String, String> header, String jsonParams, int second) { HttpPost httpPost = new HttpPost(url); if (second > 0) { RequestConfig requestTime = RequestConfig.custom().setSocketTimeout(second * 1000).setConnectTimeout(second * 1000).build(); // 设置请求和传输超时时间 httpPost.setConfig(requestTime); } return sendJsonReq(httpPost, header, jsonParams); } /** * sendPutReq * * @param url url * @param header header * @param jsonParams 参数 * @return HttpResp */ public HttpResp sendPutReq(String url, Map<String, String> header, String jsonParams) { HttpPut httpPut = new HttpPut(url); return sendJsonReq(httpPut, header, jsonParams); } /** * sendPatchReq * * @param url url * @param header header * @param jsonParams 参数 * @return HttpResp */ public HttpResp sendPatchReq(String url, Map<String, String> header, String jsonParams) { HttpPatch httpPatch = new HttpPatch(url); return sendJsonReq(httpPatch, header, jsonParams); } /** * sendDeleteReq * * @param url url * @param header url * @return HttpResp */ public HttpResp sendDeleteReq(String url, Map<String, String> header) { HttpDelete httpDelete = new HttpDelete(url); // 设置请求和传输超时时间 //httpDelete.setConfig(requestConfig); return sendReq(httpDelete, header); } /** * sendReq * * @param httpRequest httpRequest * @param headers headers * @return HttpResp */ private HttpResp sendReq(HttpRequestBase httpRequest, Map<String, String> headers) { HttpResp resp = new HttpResp(); // 设置请求头 setHeader(httpRequest, headers); try { CloseableHttpResponse response = getHttpUtilClient().execute(httpRequest); String respBody = null; if (response.getEntity() != null) { respBody = EntityUtils.toString(response.getEntity()); } StatusLine statusLine = response.getStatusLine(); resp.setHttpStatus(statusLine.getStatusCode()); resp.setRespContent(respBody); Header[] headerArr = response.getAllHeaders(); if (headerArr != null) { Map<String, String> headerMap = new HashMap<>(); for (Header header : headerArr) { headerMap.put(header.getName(), header.getValue()); } resp.setRespHeader(headerMap); } } catch (IOException e) { logger.error("send Req:",e); System.out.println("Failed to sendReq,url=" + httpRequest.getURI()); } finally { httpRequest.releaseConnection(); } return resp; } /** * sendJsonReq * * @param httpRequest httpRequest * @param header header * @param jsonParams jsonParams * @return HttpResp */ private HttpResp sendJsonReq(HttpEntityEnclosingRequestBase httpRequest, Map<String, String> header, String jsonParams) { if (!StringUtils.isEmpty(jsonParams)) { httpRequest.setEntity(new StringEntity(jsonParams, ContentType.create(APPLICATION_JSON, UTF8))); } return sendReq(httpRequest, header); } /** * 设置HTTP请求头 * * @param httpRequest httpRequest * @param header header */ private void setHeader(HttpRequestBase httpRequest, Map<String, String> header) { if (header == null || header.isEmpty()) { return; } for (Entry<String, String> entry : header.entrySet()) { httpRequest.addHeader(entry.getKey(), entry.getValue()); } } /** * 拼接GET请求的URL和参数 * * @param url url * @param body body * @return String */ private String buildGetUrl(String url, Map<String, Object> body) { StringBuffer realPath = new StringBuffer(); realPath.append(url); if (!url.contains("?")) { realPath.append("?"); } else { realPath.append("&"); } if (body != null && !body.isEmpty()) { for (Entry<String, Object> entry : body.entrySet()) { realPath.append(entry.getKey()).append("=").append(String.valueOf(entry.getValue())).append("&"); } } realPath.deleteCharAt(realPath.length() - 1); return realPath.toString(); } } 这个是4的,我要改为5的版本
10-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TechBro华仔

日拱一卒无有尽,功不唐捐终入海

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值