[英]How to use non-blocking HTTP requests in Mulesoft 4 Custom Connector
我正在嘗試構建一個 Mulesoft 自定義連接器,該連接器向第三方系統發出 HTTP 請求,我希望以非阻塞方式發出這些 HTTP 請求,以便執行可以繼續執行而無需等待 Z293C9EA246FFF9989ADC6 的響應被退回。
此處的 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
HttpClient 能夠使用非阻塞 I/O 來發出請求。
但我不明白怎么做!
上面的示例代碼從HttpClient
接口調用方法send(String, String, HttpResponseCallback)
。 但是, Mulesoft 的 API javadoc中記錄的HttpClient
接口沒有這樣的方法。
我看到HttpClient
接口確實具有sendAsync(HttpRequest request)
方法,但我無法理解如何將其與示例代碼一起使用。
我了解 Mulesoft 的HttpClient
是使用 Project Grizzly 的 HTTP 客戶端實現的,並且支持非阻塞請求,所以我覺得這是可以做到的,我只是不明白如何......
感謝您的任何提示!
嗨,我試圖用相同 的非阻塞操作文檔來實現同樣的事情,但我做不到,所以我嘗試基於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 連接器,其中調用是異步的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.