HttpClient Reactor-Netty отправляет запрос HttpClientRequest на HttpServer. На стороне сервера я не могу получить объект запроса из HttpServerRequest. Я могу получить FluxByteBuf из HttpServerRequest, но не объект ByteBuf в объекте Flux. Обычно подписка на Flux позволяет мне получить объект запроса, но здесь это не работает. Ответ от сервера успешно получен клиентом. Кто-нибудь знает, почему подписка на Flux / Mono не работает на стороне сервера клиента / сервера Reactor-Netty?
Код клиента:
public class Client {
private static final Logger log = Logger.getLogger(Client.class.getSimpleName());
public static void main(String[] args) throws InterruptedException {
Consumer<byte[]> onSuccess = (byte[] response) -> {
ElectionResponse electionResponse = SerializationUtils.deserialize(response);
log.info("response in onSuccess: "+electionResponse);
};
Consumer<Throwable> onError = (Throwable ex) -> {
ex.getMessage();
};
Runnable onCompletion = () -> {
System.out.println("Message Completed");
};
ElectionRequest electionRequest = new ElectionRequest("aRequest");
byte[] requestBytes = SerializationUtils.serialize(electionRequest);
ByteBuf requestByteBuf = Unpooled.copiedBuffer(requestBytes);
HttpClient.create()
.tcpConfiguration(tcpClient -> tcpClient.host("10.0.0.19"))
.port(61005)
.post()
.uri("/echo")
.send(Mono.just(requestByteBuf))
.responseContent()
.aggregate()
.asByteArray()
.subscribe(onSuccess, onError, onCompletion);
try {
Thread.sleep(15000);
} catch(InterruptedException ie) {
ie.printStackTrace();
}
}
}
Код сервера:
public class Server {
private static final Logger log = Logger.getLogger(Server.class.getSimpleName());
public static void main(String[] args) {
ElectionResponse electionResponse = new ElectionResponse("aResponse");
byte[] responseArray = SerializationUtils.serialize(electionResponse);
Consumer<ByteBuf> onSuccess = (ByteBuf request) -> {
System.out.println("onSuccess: Request received!");
};
Consumer<Throwable> onError = (Throwable ex) -> {
ex.getMessage();
};
Runnable onCompletion = () -> {
System.out.println("Message Completed");
};
DisposableServer server =
HttpServer.create()
.host("10.0.0.19")
.port(61005)
.route(routes ->
routes
.post("/echo",
(request, response) -> {
request.receive().retain().next().subscribe(onSuccess, onError, onCompletion);
return response.send(Mono.just(Unpooled.copiedBuffer(responseArray).retain()));
}
))
.bindNow();
server.onDispose()
.block();
}
}
Зависимости среды и maven следующие:
Apache Maven 3.6.1
Maven home: /usr/share/maven
Java version: 11.0.6, vendor: Oracle Corporation, runtime: /home/linuxlp/opt/graalvm/graalvm-svm-linux-20.1.0-ea+28
Default locale: en_US, platform encoding: UTF-8
OS name: "linux", version: "5.3.0-51-generic", arch: "amd64", family: "unix"
<dependencies>
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-core</artifactId>
<version>3.3.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.reactivestreams</groupId>
<artifactId>reactive-streams</artifactId>
<version>1.0.3</version>
</dependency>
I am not able to get the request object out of the HttpServerRequest
. Предоставленный HttpServerRequest содержит все, что вам может понадобиться, например, метод, uri, заголовки и т. Д., А такжеreceive
у вас есть тело. - person Violeta Georgieva   schedule 19.05.2020