Rabbitmq和websocket实现消息通信的整理
- 问题描述
在用springboot 集成websocket过程中,利用rabbimq实现消息代理的时候,会出现一些坑,纪录下遇到的问题,以备份防坑。按以下4个步骤,基本上可以跨坑。
- 步骤描述
- 步骤一:
Rabbitmq要实现消息代理,需要开启stomp通道
①进入到rabbitmq安装目录下的sbin:
|
②执行命令:rabbitmq-plugins list 查看stomp协议相关的插件是否启动
下图是启动,红框处是:e*或者E*,如果没有启动,执行如下命令
rabbitmq-plugins enable rabbitmq_web_stomp
rabbitmq-plugins enable rabbitmq_web_stomp_examples
|
- 步骤二:
Java代码:
Springboot集成了websocket的消息代理,参数如下:
stompPort:61613
host rabbitmq的地址
username/password 用户名和密码
virtualHost 虚拟主机名
username和password最好别用guest(涉及到远程登录问题,需要改配置)
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Value("${spring.proxy.rabbitmq.host}")
private String host;
@Value("${spring.proxy.rabbitmq.stomp.port}")
private Integer stompPort;
@Value("${spring.proxy.rabbitmq.username}")
private String username;
@Value("${spring.proxy.rabbitmq.password}")
private String password;
@Value("${spring.proxy.rabbitmq.virtual-host}")
private String virtualHost;
@Bean
public ServerEndpointExporter serverEndpointExporter() {
return new ServerEndpointExporter();
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/building-websocket")
.setAllowedOrigins("*")
.withSockJS();
}
/**
* enableSimpleBroker 服务端推送给客户端的路径前缀
*/
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
//registry.enableSimpleBroker("/topic");
registry.enableStompBrokerRelay("/topic", "/queue")
.setRelayHost(host)
.setRelayPort(stompPort)
.setClientLogin(username)
.setSystemLogin(username)
.setSystemPasscode(password)
.setClientPasscode(password)
.setVirtualHost(virtualHost);
registry.setApplicationDestinationPrefixes("/app");
}
- 步骤三:
假如连接rabbitmq的用户密码是:admin/123456
则要绑定上对应的虚拟主机,自己设定,我这里设定的是:”/”(也可以是自己添加的其他的)
使用admin登录进去,点击admin ->admin
选择虚拟主机,设置权限
- 步骤四:
注意事项1:启动项目之前,需要找到rabbitmq的配置文件,目录:
Xxx/xxx/rabbitmq/etc/rabbitmq/
大坑:通常一般只有一个文件(离线安装),而没有rabbitmq的配置文件。如图:
这时候启动项目,连接正常,也不会报错,但是websocket的连接会提示用户权限被拒绝。
需要手动添加一个配置文件到该目录下
文件名:rabbitmq.config
文件内容:[{rabbit, [{tcp_listeners, [5672]},{loopback_users, []}]}].
注意事项2:队列名不能使用斜杠“/”,rabbitmq不识别
(使用simplebroker简单消息代理没问题)
例如: /topic/fire/alarm 不符合要求
正常:/topic/fire.alarm 或者/topic/firealarm
关于Rabbitmq和websocket的集成,其他基本的代码和配置可以参考如下链接: