Springboot 整合Websocket+Stomp协议+RabbitMQ做消息代理 实例教程

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Web前端全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024c (备注前端)
img

正文

registry.setApplicationDestinationPrefixes(“/app”) :

意思是客户端程序访问服务器,需带有/app 前缀,那么这些带有/app的消息就会匹配到@MessageMapping注解的方法上。

(可以理解为客户端向服务端推送消息使用)

registry.setUserDestinationPrefix(“/user”) :

这个就比较好玩,就是服务端指定给用户一对一推送消息,使用 sendToUser 方法时,会帮我们默认拼接上 /user,所以客户端也需要订阅相关的/user前缀的主题才能正常接收。(后面代码还会介绍到)

而我们该篇是使用rabbitmq作为消息代理,所以咱们的代码是:

这些代码就没啥还解释了,上面都说了核心的几个代码意义了,其余就是连接rabbbitmq的一些相关信息,账号密码,虚拟host等。

registry.setUserDestinationPrefix(“/user”); //这是给sendToUser使用,前端订阅需要加上/user

registry.setApplicationDestinationPrefixes(“/app”); //这是给客户端推送消息到服务器使用 ,推送的接口加上/app

// "STOMP broker relay"处理所有消息将消息发送到外部的消息代理

registry.enableStompBrokerRelay(“/exchange”,“/topic”,“/queue”,“/amq/queue”)

.setVirtualHost(“JCChost”)

.setRelayHost(“localhost”)

.setClientLogin(“root”)

.setClientPasscode(“root”)

.setSystemLogin(“root”)

.setSystemPasscode(“root”)

.setSystemHeartbeatSendInterval(5000)

.setSystemHeartbeatReceiveInterval(4000);

再来看 configureClientInboundChannel ,

这个就比较关键,使用客户端绑定配置,咱们绑定了一个拦截器 getHeaderParamInterceptor ,从命名看就知道,就是为了拦截一些参数。

没错,为了识别客户端连接到咱们的websocket上,到底是谁? 我们该篇采取的就是,让客户端连接时携带自己的个人唯一识别信息过来,在建立连接时,取出该参数,为其实现用户信息认证设置。

需要创建GetHeaderParamInterceptor.java:

import org.springframework.messaging.Message;

import org.springframework.messaging.MessageChannel;

import org.springframework.messaging.simp.SimpMessageHeaderAccessor;

import org.springframework.messaging.simp.stomp.StompCommand;

import org.springframework.messaging.simp.stomp.StompHeaderAccessor;

import org.springframework.messaging.support.ChannelInterceptorAdapter;

import org.springframework.messaging.support.MessageHeaderAccessor;

import org.springframework.stereotype.Component;

import java.util.LinkedList;

import java.util.Map;

/**

  • @Author : JCccc

  • @CreateTime : 2020/8/26

  • @Description :

**/

@Component

public class GetHeaderParamInterceptor extends ChannelInterceptorAdapter {

@Override

public Message<?> preSend(Message<?> message, MessageChannel channel) {

StompHeaderAccessor accessor = MessageHeaderAccessor.getAccessor(message, StompHeaderAccessor.class);

if (StompCommand.CONNECT.equals(accessor.getCommand())) {

Object raw = message.getHeaders().get(SimpMessageHeaderAccessor.NATIVE_HEADERS);

if (raw instanceof Map) {

Object name = ((Map) raw).get(“username”); //取出客户端携带的参数

System.out.println(name);

if (name instanceof LinkedList) {

// 设置当前访问的认证用户

accessor.setUser(new UserPrincipal(((LinkedList) name).get(0).toString()));

}

}

}

return message;

}

}

为了完成用户信息的设置,需要使用到Principal ,所以我们还需要创建 UserPrincipal.java:

import java.security.Principal;

/**

  • @Author : JCccc

  • @CreateTime : 2020/8/26

  • @Description :

**/

public class UserPrincipal implements Principal {

private final String name;

public UserPrincipal(String name) {

this.name = name;

}

@Override

public String getName() {

return name;

}

}

ok,也就是说关于websocket的配置,我们创建了上面的三个文件(继续敲代码前,先自己回顾一下这三个东西的作用):

接下来,我们需要为项目整合上 RabbitMQ。

创建MyRabbitConfig.java:

提前说下,这个关于rabbitmq的所有东西,我暂且都配置在这里。

import cn.jc.springbootwebsocketdemo.service.ChatService;

import org.springframework.amqp.core.*;

import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;

import org.springframework.amqp.rabbit.connection.ConnectionFactory;

import

  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值