0

我正在尝试构建一个 Mulesoft 自定义连接器,该连接器向第三方系统发出 HTTP 请求,我希望这些 HTTP 请求以非阻塞方式发出,以便执行可以继续而无需等待 HTTP 响应被退回。

此处的 Mulesoft 文档中有一个示例,其中显示了此示例代码:

public void request(String url, @Connection HttpClient client, @Content String body, 
    CompletionCallback<InputStream, HttpAttributes> callback ) { 
 client.send(url, body, new HttpResponseCallback() {
   void onResponse(HttpResponse response) {
     callback.success(Result.<InputStream, HttpAttributes>builder() 
                          .output(response.getBody())
                          .attributes(toAttributes(response))
                          .build());
   }

   void onError(Exception e) {
     callback.error(e); 
   }
 });
}

它还指出可以提供非阻塞行为

通过支持异步响应的 HttpClient

Mulesoft 的自定义连接器文档状态

HttpClient 能够使用非阻塞 I/O 来发出请求。

但我不明白怎么做!

send(String, String, HttpResponseCallback)上面的示例代码从HttpClient接口调用一个方法。但是,Mulesoft 的 API javadocHttpClient中 记录的接口没有这样的方法。

我看到该HttpClient接口确实有sendAsync(HttpRequest request)方法,但我无法理解如何将其与示例代码一起使用。

我知道 MulesoftHttpClient是使用 Project Grizzly 的 HTTP 客户端实现的,并且支持非阻塞请求,所以我觉得这是可能的,我只是不明白如何......

感谢您的任何提示!

4

1 回答 1

1

嗨,我试图用相同的非阻塞操作文档来实现同样的事情,但我做不到,所以我尝试基于 Slack 连接器,那里有很多示例,他们使用其他代码来实现异步调用具有 CompletionCallback 的 ChannelOperations

但是,这对我不起作用,我想也许我必须在服务器端进行另一种解决方法才能实现异步调用。无论如何,最后,我使用 CompletableFuture 在其他线程中运行请求,请求是同步方式但在 CompletableFuture.runAsync 中执行异步

public void request(String url, @Connection HttpClient client, @Content String body) { 

HttpResponse response = null;
HttpEntity entity = new ByteArrayHttpEntity(body.toString().getBytes());
HttpRequest httpRequest = HttpRequest.builder().uri(url).addHeader("Content-Type", "application/json")
                .method("POST").entity(entity).build();
CompletableFuture.runAsync(() -> {
 try {
            client.start();
            response = client.send(httpRequest, 30000, true, null);
        } catch (IOException | TimeoutException e) {
                LOGGER.error(response.toString());
        }
    LOGGER.info(response.toString());
        client.stop();
    
    LOGGER.info("Finish");
});
}

有一个类似于DMI的 Mule 连接器,其中调用是异步的

于 2021-05-06T00:14:46.217 回答