I'm writing a ClientConnector
class using NetClient
and JsonParser
.
Here are the steps I went into:
- Connect to server using
NetClient
- Use
Pump
to handle backpressure - Use
io.vertx.core.parsetools.JsonParser
to parse full JSON response objects - Write 2 requests on socket
The problem is that I get a server response only for the 1st request.
How can I get responses for subsequent requests?
Here down the AsyncClientConnector
class code:
package com.luckyrhinos.sbg.robots;
import static io.vertx.core.parsetools.JsonEventType.VALUE;
import static org.awaitility.Awaitility.await;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import org.junit.Test;
import com.luckyrhinos.core.common.utils.RefHolder;
import io.vertx.reactivex.core.Vertx;
import io.vertx.reactivex.core.net.NetClient;
import io.vertx.reactivex.core.net.NetSocket;
import io.vertx.reactivex.core.parsetools.JsonParser;
import io.vertx.reactivex.core.streams.Pump;
public class JsonRequestTest {
@Test
public void testName() throws Exception {
Vertx vertx = Vertx.vertx();
NetClient client = vertx.createNetClient();
RefHolder<NetSocket> hSocket = new RefHolder<>();
AtomicBoolean ready = new AtomicBoolean(false);
client.rxConnect(12344, "localhost") //
.subscribe(socket -> {
Pump.pump(socket, socket).start();
JsonParser parser = JsonParser.newParser().objectValueMode();
hSocket.obj = socket;
socket //
.exceptionHandler(e -> {
e.printStackTrace();
client.close();
}) //
.endHandler(v -> {
System.out.println("Done!");
client.close();
}) //
.handler(parser::handle);
parser.handler(event -> {
if (event.type() == VALUE) {
System.out.println(event.value());
}
});
ready.set(true);
});
await().atMost(5, TimeUnit.SECONDS).untilTrue(ready);
ready.set(false);
hSocket.obj.write("{ \"type\":\"SetupRequest\",\"ply\":2 }");
hSocket.obj.write("{ \"type\":\"PingRequest\", \"id\":\"123456789\" }");
await().atMost(5, TimeUnit.SECONDS).untilTrue(ready);
}
}