SpringBoot3新特性@RSocketExchange轻松实现消息实时推送

createh52周前 (12-12)技术教程17

1. 简介

本篇文章将介绍与RSocket在Spring Boot中应用的相关知识,如果你对RSocket还不了解的,可以查看下面这篇文章

SpringBoot整合RSocket实时数据通信

从Spring 6和Spring Boot 3开始,类似于其他声明式客户端(如OpenFeignRetrofit),Spring框架支持将RSocket服务创建为一个Java接口,其中使用注解的方法用于RSocket交互。接下来我将使用@RSocketExchange来创建一个用于RSocket协议的声明式请求者客户端。

一个声明式HTTP接口是一个Java接口,它有助于减少样板代码,生成实现该接口的代理,并在框架级别执行交互。

2. 实战案例

2.1 依赖管理

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-rsocket</artifactId>
</dependency>

该starter中包含所有必要的类和接口。

2.2 使用@RSocketExchange

@RSocketExchange注解用于在RSocket服务接口上声明一个方法作为RSocket端点。它接受一个value参数,该参数定义了端点路由。与用于HTTP传输的@RequestMapping类似,@RSocketExchange可以在接口级别使用,以表达一个公共路由,该路由将被所有服务方法继承。

public interface MessageService {    
  @RSocketExchange("message")  
  public Mono<String> sendMessage(Mono<String> requestObject);
}

服务方法可以接受以下方法参数:

  • @DestinationVariable: 添加路由变量,将模板占位符扩展到路由中。
  • @Payload:可选注解,用于设置请求的输入有效载荷。
  • Object,然后是 MimeType:发送输入有效载荷中的附加元数据项及其 MIME 类型。
public interface MessageService {
  @RSocketExchange("message/{name}")  
  public Mono<String> sendMessage(@DestinationVariable("name") String name,@Payload Mono<String> content);
}

Spring底层会生成一个实现 MessageService 接口的代理,并使用底层的 RSocketRequester 进行交互。

2.3 生成服务代理

众所周知,Spring Boot自动配置会为我们自动配置RSocketRequester.Builder。我们可以使用这个构建器来创建RSocketRequester

@Component
public class RSocketComponent {
  private final RSocketRequester.Builder requesterBuilder;  
  public RSocketComponent(RSocketRequester.Builder requesterBuilder) {    
    this.requesterBuilder = requesterBuilder ;  
  }  
 @PostConstruct  public void initRSocket() {    
   RSocketRequester rsocketRequester = requesterBuilder.tcp("localhost", 7000);
 }
}

接下来,我们可以使用 RSocketRequester 来初始化一个 RSocketServiceProxyFactory,最终用于为任何带有 @RSocketExchange 方法的 RSocket 服务接口创建客户端代理。

RSocketServiceProxyFactory factory = RSocketServiceProxyFactory.builder(rsocketRequester).build() ;
MessageService messageService = factory.createClient(MessageService.class) ;

这里就得到了MessageService服务对象,接下来就可以进行服务调用的测试了。

针对RSocket服务端,我这里打算还是使用下面这篇文章中的服务端程序

SpringBoot整合RSocket实时数据通信

RSocketComponent中添加如下方法,执行服务端接口调用

public Mono<String> message(Mono<String> requestObject) {  
  return this.service.sendMessage(requestObject) ;
}

接下来,我们就可以进行测试

2.4 测试

这里,通过Controller接口进行测试

@RestController
@RequestMapping("/messages")
public class MessageController {    
  private final RSocketComponent rc ;  
  public MessageController(RSocketComponent rc) {   
    this.rc = rc ;  
  }
  
  @GetMapping("msg")  
  public String msg(String msg) {    
  	return this.rc.message(Mono.just(msg)).block() ;  
  }
}

服务端控制台输出

接收到消息:Hello
接收到消息:Pack

测试通过;与Spring6之前版本相比较通过@RSocketExchange注解简化了我们客户端调用RSocket服务。其实,这种方式与Spring6中的@HttpExchange的使用及原理差不多。

微信公众号:Spring全家桶实战案例源码

相关文章

干货|SpringBoot集成极光推送完整实现代码(建议收藏)

工作中经常会遇到服务器向App推送消息的需求,一般企业中选择用极光推送的比较多,在集成极光时发现极光的文档并不完整,网上的文章也很多不能直接使用,这里列出我在工作中集成极光的全部代码,只需要按照如下代...

WebSocket在Java Spring Boot+Vue框架中实现消息推送功能

在现代Web应用中,实时消息提醒是一项非常重要的功能,能够极大地提升用户体验。WebSocket作为一种在单个TCP连接上进行全双工通信的协议,为实现实时消息提醒提供了高效且低延迟的解决方案。本文将详...

「Java基础」Springboot+Websocket的实现后端数据实时推送

这篇文章主要就是实现这个功能,只演示一个基本的案例。使用的是websocket技术。一.什么是websocketWebSocket协议是基于TCP的一种新的网络协议。它实现了客户端与服务器全双工通信,...

JAVA后端推送企业微信消息到普通微信

接收消息的用户不需要安装企业微信,普通微信就可以。特殊情况开发者需要推送某些即时消息到普通微信端的时候可用,支持推送文字,图文,视频,文件,markdown,及模板等消息# 1.申请注册企业微信(目前...

轻松实现服务器事件推送!Spring SseEmitter 详解

引言服务器推送技术背景简介服务器推送(Server Push)技术允许网站和应用在有新内容可用时主动向用户推送更新,而不需要用户主动去查询。与传统的"拉"模型不同,服务器推送采用...