当前位置: 首页 > 面试题库 >

无效使用BasicClientConnManager:仍分配连接

唐宇定
2023-03-14
问题内容

我正在打电话给REST URL,并试图衡量恢复响应所花费的时间。

DefaultHttpClient为此目的是要从获得回复REST URL

在下面的程序中,每个线程将在特定范围内工作。就像每个线程将在1 - 100第二个线程之间工作,101 - 200等等。

因此,在我下面的代码中,它第一次正常工作。但是,这是第二次在该行上抛出异常,httpclient.execute因为-

java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.

我在这里做错什么吗?-

以下是我的代码-

class Task implements Runnable {

    private DefaultHttpClient httpclient = new DefaultHttpClient();
    private HttpGet httpGet;
    private HttpResponse response;

    @Override
    public void run() {

        try {

            httpGet = new HttpGet(
                    "http://localhost:8080/service/BEService/v1/get/USERID=10000/profile.ACCOUNT.SERVICE
            httpGet.getRequestLine();

            for (int userId = id; userId < id + noOfTasks; userId++) {

                    long start = System.nanoTime();

                    response = httpclient.execute(httpGet);

                    long end = System.nanoTime() - start;
                }
        } catch (Exception e) {
            LOG.error("Threw a Exception in " + getClass().getSimpleName(), e);
        }
    }
}

更新代码:

如果我正在做这样的事情-

class Task implements Runnable {

    private DefaultHttpClient httpclient = new DefaultHttpClient();
    private HttpGet httpGet;
    private HttpResponse response;

    @Override
    public void run() {

        try {

            for (int userId = id; userId < id + noOfTasks; userId++) {

                httpGet = new HttpGet("http://localhost:8080/service/BEService/v1/get/USERID=10000/profile.ACCOUNT.SERVICE");
                httpGet.getRequestLine();

                long start = System.nanoTime();

                response = httpclient.execute(httpGet);

                long end = System.nanoTime() - start;

                HttpEntity entity = response.getEntity();
                EntityUtils.consume(entity);
                }
        } catch (Exception e) {
            LOG.error("Threw a Exception in " + getClass().getSimpleName(), e);
        }
    }
}

那好吗?


问题答案:

我在这里做错什么吗?

是。如文档所述:

BasicClientConnectionManager是一个简单的连接管理器,一次仅维护一个连接。即使此类是线程安全的,也应仅由一个执行线程使用。BasicClientConnectionManager将努力将连接重新用于具有相同路由的后续请求。但是,如果持久连接的路由与连接请求的路由不匹配,它将关闭现有连接并针对给定的路由重新打开它。如果已经分配了连接,则抛出java.lang.IllegalStateException。

默认情况下,HttpClient使用BasicClientConnectionManager。

有关如何使用可处理多个线程中的请求的池连接管理器,请参阅“多线程请求执行”。



 类似资料:
  • 问题内容: 我正在使用google-api-client-java 1.2.1-alpha执行POST请求,并在我执行execute()HttpRequest时得到以下stacktrace。 在我捕获并忽略从先前的POST到相同URL的403错误并重新用于后续请求的传输之后,它立即发生。(这是将多个条目插入同一ATOM提要的循环)。 403之后,我应该做些什么来“清理”吗? 为什么我下面的代码试图

  • 我有下面的代码,将检查,看看用户是否在数据库中可用之前,他被授予访问该网站,但是当用户输入任何值,它将登录他,即使他没有在数据库中注册。在这段代码之后是JQuery代码,我也用它来防止任何值被输入到数据库中,如果字段是空的,并且它不是默认的文本字段值它继续登录过程,而不是阻止我在填写所需字段之前做任何事情。 下一行是JQuery代码。

  • 问题内容: 下面的简单测试案例失败了,但有一个例外。 我不知道怎么了 问题答案: Mockito要求您在存入方法调用时仅使用原始值或仅使用匹配器。完整的例外情况(您未在此处发布)肯定可以解释所有情况。 简单更改行: 至 它应该工作。

  • 本文向大家介绍Vue使用Proxy代理后仍无法生效的解决,包括了Vue使用Proxy代理后仍无法生效的解决的使用技巧和注意事项,需要的朋友参考一下 vue.js 配置了前端代理却未能生效 记录一下最近踩得小坑: 配置完代理后请一定重新执行(重要,非常重要!) npm run dev 若重新执行命令后,代理仍为生效,请按下方步骤进行检查: 检查index.js文件中的代理是否配置正确,示例如下: 检

  • 我们将app engine与CloudSQL结合使用,有时会出现以下异常。只有当我们从Java执行本机查询时才会发生这种情况(当我们使用JPA时不会发生这种情况)。知道怎么摆脱它吗? 异常[EclipseLink-4002](Eclipse持久性服务-2.3.2.v20111125-r10461):org。日食坚持不懈例外。DatabaseException内部异常:com。谷歌。云sql。jdb

  • 如果将块分配给文件,使得文件的所有逻辑块都得到硬盘中的连续物理块,则这种分配方案被称为连续分配。 在下面显示的图像中,目录中有三个文件。 表中提到了起始块和每个文件的长度。 我们可以在表格中检查连续块是否按照需要分配给每个文件。 优点 实现起来很简单。 可获得优秀的读取性能。 支持随机访问文件。 缺点 磁盘将变成碎片。 文件增长可能很困难。