使用Java 11 Java.net.http HttpClient sendAsync实现AWS SDK v2 SdkAsyncHttpClient

使用Java 11 Java.net.http HttpClient sendAsync实现AWS SDK v2 SdkAsyncHttpClient,java,reactive-programming,aws-sdk-java-2.0,Java,Reactive Programming,Aws Sdk Java 2.0,我正在尝试实现一个使用Java11(特别是sendAsync)的。SdkAsyncHttpClient有一种方法可以实现CompletableFuture执行(AsyncExecuteRequest AsyncExecuteRequest)。AsyncExecuteRequest提供了一种获取HTTP请求详细信息的方法,关键是提供了一个SdkHttpContentPublisher。这进入了反应式发布/订阅模型的范例中,该模型HttpClient.sendAsync似乎内置了对的支持。我似乎接近

我正在尝试实现一个使用Java11(特别是
sendAsync
)的。SdkAsyncHttpClient有一种方法可以实现
CompletableFuture执行(AsyncExecuteRequest AsyncExecuteRequest)
AsyncExecuteRequest
提供了一种获取HTTP请求详细信息的方法,关键是提供了一个
SdkHttpContentPublisher
。这进入了反应式发布/订阅模型的范例中,该模型
HttpClient.sendAsync
似乎内置了对的支持。我似乎接近实现,但(至少)缺少一个关键步骤,因为我似乎无法完成返回的未来

我想我可能错过了一些基本的东西,以一种直接的方式将两者联系在一起,但到目前为止我还没有找到

下面是我尝试的一个简单的实现:

import org.reactivestreams.Subscriber;
导入org.reactivestreams.Subscription;
导入software.amazon.awssdk.http.Protocol;
导入software.amazon.awssdk.http.SdkHttpConfigurationOption;
导入software.amazon.awssdk.http.SdkHttpRequest;
导入software.amazon.awssdk.http.async.AsyncExecuteRequest;
导入software.amazon.awssdk.http.async.SdkAsyncHttpClient;
导入software.amazon.awssdk.http.async.SdkHttpContentPublisher;
导入software.amazon.awssdk.utils.AttributeMap;
导入java.net.http.HttpClient;
导入java.net.http.HttpRequest;
导入java.net.http.HttpResponse;
导入java.nio.ByteBuffer;
导入java.time.Duration;
导入java.util.List;
导入java.util.Map;
导入java.util.concurrent.CompletableFuture;
导入java.util.concurrent.Flow;
导入静态java.net.http.HttpClient.Version.http_1_1;
导入静态java.net.http.HttpClient.Version.http_2;
导入static software.amazon.awssdk.http.Protocol.HTTP2;
导入静态软件.amazon.awssdk.http.SdkHttpConfigurationOption.CONNECTION\u超时;
导入static software.amazon.awssdk.http.SdkHttpConfigurationOption.PROTOCOL;
导入静态软件.amazon.awssdk.http.SdkHttpConfigurationOption.READ\u超时;
公共类JavaAsyncHttpClient实现SdkAsyncHttpClient{
私有最终HttpClient HttpClient;
公共JavaAsyncHttpClient(属性映射选项){
this.httpClient=httpClient.newBuilder()
.connectTimeout(options.get(连接超时))
.version(options.get(PROTOCOL)=HTTP2?HTTP_2:HTTP_1_1)
.build();
}
@凌驾
公共CompletableFuture执行(AsyncExecuteRequest AsyncExecuteRequest){
SdkHttpRequest request=asyncExecuteRequest.request();
HttpRequest.Builder requestBuilder=HttpRequest.newBuilder().uri(request.getUri());
对于(Map.Entry头:request.headers().entrySet()){
//避免java.lang.IllegalArgumentException:受限头名称:“内容长度”
如果(!header.getKey().equalsIgnoreCase(“内容长度”)和&!header.getKey().equalsIgnoreCase(“主机”)){
for(字符串headerVal:header.getValue()){
requestBuilder=requestBuilder.header(header.getKey(),headerVal);
}
}
}
开关(request.method()){
个案职位:
requestBuilder=requestBuilder.POST(HttpRequest.bodypublisher.fromPublisher(
toFlowPublisher(asyncExecuteRequest.requestContentPublisher());
打破
案件付诸表决:
requestBuilder=requestBuilder.PUT(HttpRequest.bodypublisher.fromPublisher(
toFlowPublisher(asyncExecuteRequest.requestContentPublisher());
打破
案例删除:
requestBuilder=requestBuilder.DELETE();
打破
案件负责人:
requestBuilder=requestBuilder.method(“HEAD”,HttpRequest.bodypublisher.noBody());
打破
案例补丁:
抛出新的UnsupportedOperationException(“不支持补丁”);
案例选项:
requestBuilder=requestBuilder.method(“OPTIONS”,HttpRequest.bodypublisher.noBody());
打破
}
//需要使用BodyHandlers.ofPublisher()还是这是一条死胡同?如何连接AWS发布者/订阅者
订户订户=新订户(新的CompletableFuture());
asyncExecuteRequest.requestContentPublisher().subscribe(订阅服务器);
HttpRequest HttpRequest=requestBuilder.build();
返回httpClient.sendAsync(httpRequest、HttpResponse.BodyHandlers.fromSubscriber(toFlowSubscriber(subscriber)))
。然后应用(voidHttpResponse->null);
}

private Flow.Subscriber当我问这个问题时,我并不知道——这个理由已经被践踏了。Nikita Skornyakov(@rmcsoft on Github)实现了这个确切的东西(一个
SdkAsyncHttpClient
实现,它使用Java 11的HTTP客户端(Java.net.HTTP)。可以在这里找到:(麻省理工学院许可)

为了完整起见,这里有一个自包含(您可能永远不应该使用)的Java实现:

package com.dow.as2;
导入org.reactivestreams.Publisher;
导入org.reactivestreams.Subscriber;
导入org.reactivestreams.Subscription;
导入software.amazon.awssdk.http.AbortableInputStream;
导入software.amazon.awssdk.http.Protocol;
导入software.amazon.awssdk.http.SdkHttpConfigurationOption;
导入software.amazon.awssdk.http.SdkHttpFullResponse;
导入software.amazon.awssdk.http.SdkHttpRequest;
导入software.amazon.awssdk.http.SdkHttpResponse;
导入software.amazon.awssdk.http.async.AsyncExecuteRequest;
导入software.amazon.awssdk.http.async.SdkAsyncHttpClient;
导入software.amazon.awssdk.http.async.SdkAsyncHttpResponseHandler;
导入software.amazon.awssdk.http.async.SdkHttpContentPublisher;
导入software.amazon.awssdk.utils.AttributeMap;
导入java.net.http.HttpClient;
导入java.net.http.HttpRequest;
导入java.net.http.HttpResponse;
导入java.nio.ByteBuffer;
导入java.time.Duration;
进口j