Хорошо, я новичок в RSocket. Я пытаюсь создать простой клиент RSocket и простой сервер RSocket. Из проведенного мной исследования говорится, что RSocket поддерживает возобновление:
Это особенно полезно, поскольку при отправке кадра RESUME, содержащего информацию о последнем полученном кадре, клиент может возобновить соединение и запрашивать только те данные, которые он еще не получил, избегая ненужной нагрузки на сервер и тратя время на попытки получить данные, которые уже были получены.
В нем также говорится, что клиент является ответственным за разрешение возобновления. У меня вопрос, как включить это возобновление и как отправить этот кадр RESUME. У меня есть работающие клиент и сервер, но если я выключу сервер и снова запустил его, ничего не происходит, а позже, когда клиент снова пытается связаться с сервером, он выдает: java.nio.channels.ClosedChannelException.
Это моя конфигурация клиента:
@Configuration
public class ClientConfiguration {
/**
* Defining the RSocket client to use tcp transport on port 7000
*/
@Bean
public RSocket rSocket() {
return RSocketFactory
.connect()
.resumeSessionDuration(Duration.ofDays(10))
.mimeType(MimeTypeUtils.APPLICATION_JSON_VALUE, MimeTypeUtils.APPLICATION_JSON_VALUE)
.frameDecoder(PayloadDecoder.ZERO_COPY)
.transport(TcpClientTransport.create(7000))
.start()
.block();
}
/**
* RSocketRequester bean which is a wrapper around RSocket
* and it is used to communicate with the RSocket server
*/
@Bean
RSocketRequester rSocketRequester(RSocketStrategies rSocketStrategies) {
return RSocketRequester.wrap(rSocket(), MimeTypeUtils.APPLICATION_JSON, MimeTypeUtils.APPLICATION_JSON, rSocketStrategies);
}
}
И это RestController, из которого я начинаю общение с сервером rsocket:
@RestController
public class UserDataRestController {
private final RSocketRequester rSocketRequester;
public UserDataRestController(RSocketRequester.Builder rSocketRequester) {
this.rSocketRequester = rSocketRequester.connectTcp("localhost", 7000).block();
}
@GetMapping(value = "/feed/{firstName}", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Publisher<Person> feed(@PathVariable("firstName") String firstName) {
return rSocketRequester
.route("feedPersonData")
.data(new PersonDataRequest(firstName))
.retrieveFlux(Person.class);
}
}