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

Jersey客户端异步POST请求不等待响应

屠泰平
2023-03-14

我已经创建了一个简单的Jersey客户端,它能够成功地使用有效负载执行POST请求。但现在它正在等待来自httpendpoint的响应:

public void callEndpoint(String endpoint, String payload) {

    try {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        WebResource webResource = client.resource(getBaseURI(endpoint));

        log.debug("Sending payload [" + payload + "] to URL - [" + getBaseURI(endpoint) + "]");

        // POST method - Is this blocking?
        // Is it possible to not wait for response here
        ClientResponse response = webResource.accept("application/json")
                                             .type("application/json")
                                             .post(ClientResponse.class, payload);
        if (response.getStatus() != 200) {
            log.error("The endpoint [" + getBaseURI(endpoint) + "] returned a non 200 status code [" + response.getStatus() + "] ");
        }

    } catch (Exception e) {
        log.error("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e);
    }

}

private URI getBaseURI(String endpoint) {
    // Get this URI from config
    String URL = "http://www.somewhere.com/v2/" + endpoint;
    return UriBuilder.fromUri(URL).build();
}

问:代码是否有可能不等待响应。

我试图阅读泽西客户端文档,以确定我的代码是否有可能不等待响应?我看到我们只能在读取响应后关闭连接,但在我的情况下没有用。我想在将有效负载发布到endpoint后立即关闭连接。

我只需要触发并忘记POST请求,因为我不关心响应。这是因为处理在endpoint需要很多时间,我不想让线程等待处理。

是否可以等待部分请求的响应,但不能等待所有请求的响应?是否有一个参数可以在客户端设置,使其等待/不等待?我仍在阅读java文档,所以这可能是一个非常简单的设置,但我直到现在才找到,所以在这里提问。谢谢

[更新]

我让它与以下代码一起工作,但当我运行java示例代码时,它会打印开始

public static void callEndpoint(String endpoint, String payload) {

    try {
        ClientConfig config = new DefaultClientConfig();
        Client client = Client.create(config);
        AsyncWebResource webResource = client.asyncResource(getBaseURI(endpoint));

        // POST method
        System.out.println("start");
        Future<ClientResponse> resp = webResource.accept("application/json")
                .type("application/json")
                .post(ClientResponse.class, payload);
        // This line makes the code wait for output
        //System.out.println(resp.get()); 

    } catch (Exception e) {

        System.out.println ("The endpoint for " + endpoint + " - " + getBaseURI(endpoint) + " is not reachable. This is the exception - " + e);
    }
    System.out.println("done");
}

共有2个答案

斜高翰
2023-03-14

我的回复有点晚,但我似乎有办法解决你的两个问题。希望它将来能帮助到某人。

我会保持简短,并提供在这个平台上已经提出的问题的参考

对于第一个问题,您不想等待。您可以在其客户端对象中使用泽西提供的超时属性。下面是解决这个问题的链接。如何使用泽西2. x设置连接和读取超时?

对于第二个问题,您可以看到它只有在运行一段时间后才会停止,这是因为客户端线程一直运行到超时。请在下面的链接中找到更好的描述Jersey客户端异步调用似乎会留下挂起的线程

唐恺
2023-03-14

我使用了一个TypeListener使它真正异步。当收到响应时,将调用onComplete方法。

webResource.post(new TypeListener<ClientResponse>(ClientResponse.class) {
             @Override
             public void onComplete(Future<ClientResponse> f) throws InterruptedException {
                 try {
                    ClientResponse response = f.get();
                    if (response == null || response.getClientResponseStatus() != Status.OK) {
                        System.err.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus());
                    } else{
                        System.out.println(" Async " + response.getClientResponseStatus()+" "+response.getStatus()+" "+response.getEntity(String.class));
                    }
                } catch (ExecutionException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
             }
         });
 类似资料:
  • 我有一些文件要上传,有些文件失败了,因为帖子是异步的,而不是同步的。 我正在尝试将此调用作为同步调用。 我想等回应。 如何将此调用设为同步调用? 任何帮助感谢!

  • 我有一个简单的Java应用程序,使用Jersey进行请求,在其他应用程序中,我使用Jersey的GET请求点击了一些endpoint,如下所示: 正如您所见,我甚至不关心endpoint的结果,我只想“触发”它,因为endpoint一旦收到调用,就会自行运行一些代码。 我在这里的“问题”是,我对5个endpoint进行此操作,它们通常需要3秒钟,我不需要等那么久,因为endpoint只返回一个“确

  • 是否可以在不等待响应的情况下发送HTTP请求? 我在做一个物联网项目,需要记录传感器的数据。在每一个设置中,都有许多传感器,一个中央协调器(主要由Raspberry Pi实现)从传感器收集数据,并通过Internet将数据发送到服务器。 提前感谢! 编辑:传感器是无线的,但他们使用的技术在发送到协调器时很少(或没有)延迟。此协调器必须通过Internet发送数据。但是,假设互联网连接不好。因为这将

  • 我使用Java中的创建一个线程池,每个线程在其中执行一些异步任务/调用另一个服务。我不想等待回复,但无论何时回复都会返回。 这样做将等待第一个请求完成,然后返回结果。问题是,第二个请求必须等待第一个请求的响应返回,并且只有在这之后才会被处理。如果我使用CompletableFuture的方法,也会发生同样的情况,因为我还必须使用来获取响应。 我希望所有的请求都经过检查,并在收到时返回回复。这是可以

  • 我正在尝试创建一个基于网络的网络客户端。我根据网络站点中给出的示例编写了代码。但问题是,响应是由客户端处理程序处理的 我做的一件事是在HttpTarget中创建一个setResponse()方法 因此,基本上我想同步进行,即在HttpSnoopClient中发送一个请求(channel.writeandFlush(req)),然后等待,直到HttpSnoopCLientHandler收到响应 谁能

  • 按照这里的Apache HttpAsyncClient示例,HTTPGET请求并不是一次性触发的,而是(大部分)同步触发的。 下图显示了请求的发送顺序(除了一个)。当增加请求数量时,这仍然是正确的。 我使用了另一个库(AsynHttpClient ),请求发送得更快,而且是随机的。 有什么办法可以改进这段代码,让它真正异步执行? 我添加了用于参考的代码。