简体   繁体   English

使用Wily代理时Apache HttpClient引发异常

[英]Apache HttpClient throwing Exception while using Wily agent

I have a simple filter class which connects to a different application in the same tomcat instance using Apache HttpClient. 我有一个简单的过滤器类,它使用Apache HttpClient连接到同一tomcat实例中的另一个应用程序。 Recently to improve the performance of the Tomcat server we added few custom JVM arguments to tomcat and on of the argument is as follows 最近,为了提高Tomcat服务器的性能,我们在tomcat中添加了一些自定义JVM参数,其参数如下所示

export CATALINA_OPTS="$CATALINA_OPTS -javaagent:/app/wily/Agent.jar -Dcom.wily.introscope.agentProfile=/app/wily/IntroscopeAgent_IAASTomcat.profile -Dcom.wily.introscope.agent.agentName=iaas_dev_tomcat_instance"

After adding this property the Apache HttpClient code does not work and throws following exception stack trace. 添加此属性后,Apache HttpClient代码不起作用,并引发以下异常堆栈跟踪。

java.lang.IllegalArgumentException: Socket not created by this factory.
    at org.apache.http.conn.scheme.PlainSocketFactory.isSecure(PlainSocketFactory.java:134)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:136)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultClientRequestDirector.execute(DefaultClientRequestDirector.java:309)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:501)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:456)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:422)
    at com.vzw.issi.filters.UserValidationFilter.doFilter(UserValidationFilter.java:101)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:205)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:662)

Following is my filter code. 以下是我的过滤器代码。

httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(securityServiceURL);
                // Getting the SM Header
                httpPost.setHeader(StatusReportConstants.SM_USER, httpServletRequest.getHeader(StatusReportConstants.SM_USER));
                List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
                urlParameters.add(new BasicNameValuePair(StatusReportConstants.SOURCE_APP_NAME, StatusReportConstants.APP_DISPLAY_NAME));
                urlParameters.add(new BasicNameValuePair(StatusReportConstants.SUB_SERVICE_NAME, StatusReportConstants.SERVICE_VALIDATE_USER));
                httpPost.setEntity(new UrlEncodedFormEntity(urlParameters));
                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                String jsonString = null; 
                if (null != httpEntity) {
                    jsonString = EntityUtils.toString(httpEntity);
                }
                HttpServletResponse httpServletResponse = (HttpServletResponse)response;

I am communicating on http only. 我仅在http上交流。 When I comment that JVM parameter this httpclient code works fine. 当我评论该JVM参数时,此httpclient代码可以正常工作。

Why is this happening? 为什么会这样呢?

Apparently the agent instruments the java.net.Socket class which confuses older versions of HttpClient's connection management code. 显然,该代理会检测java.net.Socket类,该类会混淆HttpClient的旧版本的连接管理代码。 If you upgrade HttpClient to version 4.2.6 or 4.3.1 the problem should go away. 如果将HttpClient升级到版本4.2.6或4.3.1,该问题将消失。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM