gpt4 book ai didi

java - RSocket 服务器失败时如何恢复与 RSocket 的 session

转载 作者:行者123 更新时间:2023-12-01 14:27:55 33 4
gpt4 key购买 nike

好的,我是 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);
}

}

最佳答案

由于 session 存储在内存中,您无法在服务器重新启动后恢复。见 io.rsocket.resume.SessionManager#sessions .

但是,如果您重新连接到同一台服务器,您仍然可以保护自己免受网络问题的影响。而且您不必发送 RESUME 帧,客户端会为您完成。

您应该配置服务器:

@Bean
ServerRSocketFactoryProcessor serverRSocketFactoryProcessor() {
return RSocketFactory.ServerRSocketFactory::resume;
}

和客户 io.rsocket.RSocketFactory.ClientRSocketFactory#resume .

你可以找到几乎完整的例子 here

关于java - RSocket 服务器失败时如何恢复与 RSocket 的 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59940849/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com