У меня есть служба HTTP, предоставляющая конечную точку GET, которая подключается к простому эхо-серверу через TCP. Служба HTTP работает в Netty.
@RestController
public class OurTcpClient {
private Connection connection;
@GetMapping("echo1")
public Mono<String> echo(@RequestParam("value") final String value) {
this.connection.outbound()
.sendString(Mono.just(String.format("%04d", value.length()) + value)) // prepend length
.then()
.subscribe();
return this.connection.inbound()
.receive()
.asString()
.next();
}
@PostConstruct
public void init() {
this.connection = TcpClient.create()
.host("localhost")
.port(10002)
.wiretap(true)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)
.option(ChannelOption.SO_KEEPALIVE, true)
.connectNow();
}
}
Я ожидаю, что я могу запросить службу, например, по адресу http://localhost: 8081 / echo1? Value = hi , как столько раз, сколько мне нравится, и получаю «привет» обратно в каждом ответе. Это работает для первого запроса. Второй запрос висит бесконечно. Если затем я отменяю второй запрос и пытаюсь выполнить другой, я получаю следующую ошибку:
{
"timestamp": "2020-04-13T18:56:40.221+0000",
"path": "/echo1",
"status": 500,
"error": "Internal Server Error",
"message": "Only one connection receive subscriber allowed."
}
Любая помощь будет принята с благодарностью.