嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-12-24 2502 次浏览 标签 : Java

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

在并行的执行 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即可。

还是自己多线程编程经验不足,导致出现了这样的问题。

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表