如果不混合这两种变体,是否可以在“传统”的基于 servlet 的 Spring 应用程序中使用Spring 的 RSocket 集成,而不必牺牲 Spring 根据文档提供的功能?
如果是这样,怎么办?有什么陷阱需要注意吗?
目标是允许现有的基于 Servlet 的 Spring 应用程序通过 RSocket 与各种客户端通信。服务器端既不需要也不需要完全反应式的背压体验。必须启动一个与 servlet 容器一起运行的单独的基于 Netty 的服务器是可以接受的。
为了解决评论中提出的问题,有一些我特别关心的功能:
@PreAuthorize由应用程序的基于 servlet 的部分和基于 RSocket 的部分调用的方法?如何设置路由元数据(在服务器使用 Spring Boot Rsocket 时仅使用 RSocket-Java 的有效负载。
Flux<Payload> s = connection.flatMapMany(requester -> requester.requestStream(DefaultPayload.create("Some Message")))
服务器正在使用@MessageMapping("/route")
我按照 spring-rsocket-demo 项目来完成我的代码。我在服务器端代码中添加了一些身份验证逻辑,如下所示。您可以看到我在身份验证逻辑“CLIENT.add(requester)”之后抛出了一个异常。我在 spring-rsocket-demo 项目中执行名为“testRequestGetsResponse”的测试方法,发现无法收到异常。如何处理 @ConnectMapping 注释方法中的设置有效负载并在需要时返回 RejectedSetupException。
requester.rsocket()
.onClose()
.doFirst(() -> {
// Add all new clients to a client list
log.info("Client: {} CONNECTED.", client);
//throw Exception during process setup payload
//my authentication code.
try {
// CLIENTS.add(requester);
throw new RuntimeException();
} catch (Exception exception) {
throw exception;
}
})
.doOnError(error -> {
// Warn when channels are closed by clients
log.warn("Channel to client {} CLOSED", client);
})
.doFinally(consumer -> {
// Remove disconnected clients from the client list …Run Code Online (Sandbox Code Playgroud)