private void subRequest(HttpPost httpost) {
String reValue = "";
while (reValue.length() == 0) {
reValue = RunUtil.subPost(this.httpClient, httpost);
if (reValue.indexOf(Config.SUCCESSINFO) > 0) 
Config.ZCS = Config.ZCS + 1;
 else
reValue = "";
}
}
// post
public static String subPost(HttpClient httpClient, HttpPost httpost) {
String reValue = "";
try {
HttpResponse response = httpClient.execute(httpost);
reValue = EntityUtils.toString(response.getEntity());
} catch (Exception e) {
httpost.abort();
}
return reValue;
}




程序总是报下面异常
异常1:
INFO   | jvm 2    | 2013/04/06 08:00:37 | 2013-4-6 8:00:37 org.apache.http.impl.client.DefaultRequestDirector tryConnect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 信息: I/O exception (java.net.BindException) caught when connecting to the target host: Address already in use: connect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 2013-4-6 8:00:37 org.apache.http.impl.client.DefaultRequestDirector tryConnect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 信息: Retrying connect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 2013-4-6 8:00:37 org.apache.http.impl.client.DefaultRequestDirector tryConnect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 信息: I/O exception (java.net.BindException) caught when connecting to the target host: Address already in use: connect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 2013-4-6 8:00:37 org.apache.http.impl.client.DefaultRequestDirector tryConnect
INFO   | jvm 2    | 2013/04/06 08:00:37 | 信息: Retrying connect
异常2:
Request already aborted
Request already aborted
Request already aborted
Request already aborted
Request already aborted



我想问的问题是
1、如果httpClient.execute(httpost)请求的服务器访还没打开,那会不会执行 httpost.abort();,如果执行了httpost.abort(); 我第二次请求还有效吗?会不会httpost就关掉了。
2、上面的异常是怎么回事啊?有人遇到过这种问题吗?

解决方案 »

  1.   

    异常信息的意思应该是,当你连接目标主机的时候,主机地址已经被使用了。估计是,你连接目标服务器的时候,上一次连接还没有成功断开,这一次连接又要发起TCP连接。
    要么,你每次请求应答完毕后,不要关闭连接;要么,你就每次请求应答都关闭连接,下一次重新建立连接,然后再关闭。不要每次请求都建立连接,用完了还不关闭连接。
      

  2.   

    这个 不知道是怎么了 想必各位高手可以帮我看看这个异常 
    http://bbs.csdn.net/topics/390421156 
    也是关于hibernate的 头都晕了 
      

  3.   

    可惜我不会WEB,如果你有并发的时候,检查你的所有类和方法是不是线程安全的。
    if (reValue.indexOf(Config.SUCCESSINFO) > 0)   
         Config.ZCS = Config.ZCS + 1;
    像这样的代码,在并发中,肯定出问题,做好线程安全。
    如果你单线程时如果是正确的,应该是多线程中资源出现竞争混乱了。
      

  4.   


    ==========================
    我只是看到你的代码举例,不一定是这里的问题,在线程并发的时候,
    你不知道哪个线程在什么时候执行,特别是你还是全局静态变量,
    这是非常危险的做法,如果N个线程并发执行这句,那结果值还正确吗?
    Config.ZCS = Config.ZCS + 1;
    如:Config.ZCS = 1
    A   1  +  1
    B     1  +  1
    C        1  +  1  
    D           2 + 1
    ABCD四个线程,在Config.ZCS值未修改的时候,已经读出数据,A保存为2,D最后保存为3所有值为3。
    再检查你的代码是否还有类似的代码。
      

  5.   

    这个我知道啊。但是这块无所谓啊。我可以接受+-3内的数据不准啊,而且在实际运行中的都是准的啊。我生成了x个HttpClient,和x个HttpPost 然后用线程池执行
    private ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 25,25,
    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i=0;i<21;i++) {
    threadPool.execute(new ThreadPoolTask(HttpClientList.get(i), HttpPostList.get(i)));
    }[13 19:30:51.909]#Thread.Id:[28]#..........##Url耗时:470 .毫秒
    [13 19:30:55.569]#Thread.Id:[30]#..........##Url耗时:4080 .毫秒
    [13 19:30:55.569]#Thread.Id:[41]#..........##Url耗时:4070 .毫秒
    [13 19:30:55.569]#Thread.Id:[27]#..........##Url耗时:4140 .毫秒
    [13 19:30:55.679]#Thread.Id:[39]#..........##Url耗时:4180 .毫秒
    [13 19:30:55.899]#Thread.Id:[37]#..........##Url耗时:4400 .毫秒
    [13 19:30:59.129]#Thread.Id:[36]#..........##Url耗时:7610 .毫秒
    [13 19:30:59.139]#Thread.Id:[50]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.139]#Thread.Id:[38]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.359]#Thread.Id:[43]#..........##Url耗时:7860 .毫秒
    [13 19:31:02.709]#Thread.Id:[47]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.709]#Thread.Id:[46]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.719]#Thread.Id:[42]#..........##Url耗时:11220 .毫秒
    [13 19:31:02.909]#Thread.Id:[53]#..........##Url耗时:11410 .毫秒
    [13 19:31:06.229]#Thread.Id:[49]#..........##Url耗时:14730 .毫秒
    [13 19:31:06.239]#Thread.Id:[55]#..........##Url耗时:14740 .毫秒
    [13 19:31:06.289]#Thread.Id:[35]#..........##Url耗时:14790 .毫秒
    [13 19:31:06.439]#Thread.Id:[45]#..........##Url耗时:14940 .毫秒
    [13 19:31:09.769]#Thread.Id:[56]#..........##Url耗时:18240 .毫秒
    [13 19:31:09.769]#Thread.Id:[51]#..........##Url耗时:18270 .毫秒我发现执行效果大概是每4个一组,启动时间依此增加,每次差不多有5秒的间隔这个间隔太长了,我不知道是我哪里写错了。还是httpclient 和 HttpPost 有什么特性呢?
      

  6.   


    我生成了x个HttpClient,和x个HttpPost 然后用线程池执行
    private ThreadPoolExecutor threadPool = new ThreadPoolExecutor(20, 25,25,
    TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(20),
    new ThreadPoolExecutor.CallerRunsPolicy());
    for (int i=0;i<21;i++) {
    threadPool.execute(new ThreadPoolTask(HttpClientList.get(i), HttpPostList.get(i)));
    }[13 19:30:51.909]#Thread.Id:[28]#..........##Url耗时:470 .毫秒
    [13 19:30:55.569]#Thread.Id:[30]#..........##Url耗时:4080 .毫秒
    [13 19:30:55.569]#Thread.Id:[41]#..........##Url耗时:4070 .毫秒
    [13 19:30:55.569]#Thread.Id:[27]#..........##Url耗时:4140 .毫秒
    [13 19:30:55.679]#Thread.Id:[39]#..........##Url耗时:4180 .毫秒
    [13 19:30:55.899]#Thread.Id:[37]#..........##Url耗时:4400 .毫秒
    [13 19:30:59.129]#Thread.Id:[36]#..........##Url耗时:7610 .毫秒
    [13 19:30:59.139]#Thread.Id:[50]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.139]#Thread.Id:[38]#..........##Url耗时:7640 .毫秒
    [13 19:30:59.359]#Thread.Id:[43]#..........##Url耗时:7860 .毫秒
    [13 19:31:02.709]#Thread.Id:[47]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.709]#Thread.Id:[46]#..........##Url耗时:11210 .毫秒
    [13 19:31:02.719]#Thread.Id:[42]#..........##Url耗时:11220 .毫秒
    [13 19:31:02.909]#Thread.Id:[53]#..........##Url耗时:11410 .毫秒
    [13 19:31:06.229]#Thread.Id:[49]#..........##Url耗时:14730 .毫秒
    [13 19:31:06.239]#Thread.Id:[55]#..........##Url耗时:14740 .毫秒
    [13 19:31:06.289]#Thread.Id:[35]#..........##Url耗时:14790 .毫秒
    [13 19:31:06.439]#Thread.Id:[45]#..........##Url耗时:14940 .毫秒
    [13 19:31:09.769]#Thread.Id:[56]#..........##Url耗时:18240 .毫秒
    [13 19:31:09.769]#Thread.Id:[51]#..........##Url耗时:18270 .毫秒我发现执行效果大概是每4个一组,启动时间依此增加,每次差不多有5秒的间隔这个间隔太长了,我不知道是我哪里写错了。还是httpclient 和 HttpPost 有什么特性呢?