当前位置: 首页 > 知识库问答 >
问题:

JerseyClient异步调用似乎会留下挂起的线程

孔山
2023-03-14

我正在使用jersey-client-3.0-SNAPSHOT。

我做一些类似的事情:

 final Client client = createClient();

......

    Builder builder = target.request();
    for (final Entry<String, String> entry : getHeaders().entrySet()) {
        builder = builder.header(entry.getKey(), entry.getValue());
    }
    final Builder finalBuilder = builder;
    executor.submit(() -> {
        final Entity<?> entity = createPostEntity();
        futureResponse = finalBuilder.async().post(entity);
        try {
            response = futureResponse.get(TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
            consumeResponse(response);
        } catch (ExecutionException | TimeoutException | InterruptedException | IOException e) {
            errorConsumer.accept(e);
        }
    });

    if (futureResponse != null) {
        try {
            futureResponse.cancel(true);
        } catch (final Exception e) {
            //does nothing, now we try keep closing resources
        }
    }
    if (response != null) {
        try {
            response.close();
        } catch (final Exception e) {
            //does nothing, now we try keep closing resources
        }
    }

...//等待回复并阅读或其他

client.close();

每次创建和销毁其中一个客户端时,都会出现一个新的线程。

有没有安全的方法来销毁这些线程?这是意料之中的行为吗?我做错什么了吗?

共有1个答案

冯沛
2023-03-14

泽西客户端异步调用中,每当我们在客户端对象上调用关闭()时,它会破坏异步调用中使用的线程。因此,预计每当执行client.close()语句时,它会破坏线程,下次将为下一次异步调用创建一个新线程。

现在,考虑到错误场景,关闭客户端对象和关联线程的安全方法之一如下-

    Client client = ClientBuilder.newClient();

    WebTarget webTarget = client.target(SERVER_URL).path(API_PATH);

    Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON);
    // set headers and other stuff

    AsyncInvoker asyncInvoker = invocationBuilder.async();

    asyncInvoker.get(new InvocationCallback<Response>() {

        @Override
        public void completed(Response response) {
            if (response.getStatusInfo().equals(Status.OK)) {
               // parse the response in success scenario
            } else {
               // parse the response if error response is received from server
            }
            client.close();
        }

        @Override
        public void failed(Throwable throwable) {
            System.out.println("An error occurred while calling API");
            throwable.printStackTrace();
            client.close();
        }
    });
 类似资料:
  • 我的代码看起来像 我的文件如下所示 当我运行程序时,我看到 我怎样才能修好它呢?

  • 问题内容: 我有一个简单的JavaFX 2应用程序,带有2个按钮,分别是“开始”和“停止”。单击开始按钮后,我想创建一个后台线程,该线程将进行一些处理并随着时间的推移更新UI(例如进度条)。如果单击停止按钮,我希望线程终止。 我尝试使用从文档中收集的类来完成此操作。但是,每当我单击“开始”时,UI就会冻结/挂起,而不是保持正常。 她是来自主类的用于显示按钮的代码: 这是类的代码: 相当简单,但是每

  • 问题内容: 我有两个从jquery到Web服务的ajax调用。 第一次调用()在javascript ()中开始一个间隔,并返回存储在会话变量中的消息的字符串数组。 第二个调用()上传用户并将状态保存在要返回的会话中。因此,UploadUsers将消息添加到Session,而GetMessages检索消息并将其显示给客户端。 问题是即使我异步调用这两个方法,也要等到完成。它只是加载。 我什至在要添

  • 问题内容: 我在使用该功能时遇到了麻烦。 我只需要知道SQL查询是否返回零行。 我已经尝试过以下简单的语句: 类型是哪里。上面的代码似乎不起作用。无论是否为空,它将始终打印该消息。 我检查了SQL查询本身,当存在行时它正确返回了非空结果。 关于如何确定查询是否已返回0行的任何想法?我用谷歌搜索,找不到任何答案。 问题答案: ResultSet.getFetchSize()不返回结果数!从这里: 使

  • 问题内容: 安装新的Windows系统后,我已经在默认位置(和 )安装了CygWin和64位Python(2.7.3),并将CygWin bin和Python目录都添加到了我的路径中(在用户变量PATH中)。在正常的命令窗口中,Python可以完美启动,但是当我在CygWin环境中调用它时,它挂起了,从不提示输入提示。 以前,我已经在其他计算机上做到了这一点,但始终使用旧版本的Python(32位

  • 在安装一个新的Windows系统时,我已经在其默认位置(和)安装了CygWin和64位Python(2.7.3),并将CygWin bin和Python目录都添加到了我的路径中(在用户变量path中)。在正常的命令窗口中,Python可以完美地启动,但是当我在CygWin环境中从调用它时,它会挂起,从不给我输入提示。 我以前在其他机器上也这样做过,但总是使用旧版本的Python(32位)和CygW