在并行的执行 http 请求的时候提示如下错误,不一定必现,有一定的几率会出现。
java.io.IOException: java.io.IOException: Attempted read from closed stream. at yar.transport.HttpTransport.exec(HttpTransport.java:58) at yar.concurrent.client.YarConcurrentClient$Handle.call(YarConcurrentClient.java:109) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused by: java.io.IOException: Attempted read from closed stream. at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:167) at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:137) at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:150) at org.apache.http.util.EntityUtils.toByteArray(EntityUtils.java:136) at yar.transport.HttpTransport.exec(HttpTransport.java:52)
后来发现是自己在发送和读取请求的时候使用了一个实例对象
public class YarTransportFactory { public static Map<Integer,YarTransport> yarTransportMap; static{ register(); } public static void register(){ yarTransportMap = new HashMap<>(); yarTransportMap.put(YarConstants.YAR_CLIENT_PROTOCOL_HTTP,new HttpTransport()); yarTransportMap.put(YarConstants.YAR_CLIENT_PROTOCOL_TCP,new SocketTransport()); yarTransportMap.put(YarConstants.YAR_CLIENT_PROTOCOL_UDP,new SocketTransport()); yarTransportMap.put(YarConstants.YAR_CLIENT_PROTOCOL_UNIX,new SocketTransport()); } public static YarTransport get(int yarTransportType) { YarTransport yarTransport = yarTransportMap.get(yarTransportType); if (yarTransport == null) { String exception = String.format("unsupported protocol %d", yarTransportType); throw new IllegalArgumentException(exception); } else { return yarTransport; } } }
这样导致后面使用的时候都是用的同一的对象,这样导致里面封装的CloseableHttpClient
在多线程处理的情况下会出现处理已经关闭的流的情况。后来换成每个请求都新建一个CloseableHttpClient
即可。
还是自己多线程编程经验不足,导致出现了这样的问题。