安装之前先装ERlang
安装完后找到sbin目录下cmd
输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件
重启服务
http://localhost:15672,账号密码默认是:guest/guest
pom添加
<!--rabbitmq-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
spring:
application:
name: test-rabbitmq-producer
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
virtualHost: /
配置文件
package com.mmnpf.mmnpfbackend.common.Configs.Rabbitmq;
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DirectRabbitConfig {
@Bean
public Queue DirectQueue() {
// durable:是否持久化,默认是false,持久化队列:会被存储在磁盘上,当消息代理重启时仍然存在,暂存队列:当前连接有效
// exclusive:默认也是false,只能被当前创建的连接使用,而且当连接关闭后队列即被删除。此参考优先级高于durable
// autoDelete:是否自动删除,当没有生产者或者消费者使用此队列,该队列会自动删除。
// return new Queue("DirectQueue",true,true,false);
//一般设置一下队列的持久化就好,其余两个就是默认false
return new Queue("DirectQueue",true);
}
//Direct交换机 起名:TestDirectExchange
@Bean
DirectExchange DirectExchange() {
// return new DirectExchange("DirectExchange",true,true);
return new DirectExchange("DirectExchange",true,false);
}
//绑定 将队列和交换机绑定, 并设置用于匹配键:DirectRouting
@Bean
Binding bindingDirect() {
return BindingBuilder.bind(DirectQueue()).to(DirectExchange()).with("DirectRouting");
}
@Bean
DirectExchange lonelyDirectExchange() {
return new DirectExchange("lonelyDirectExchange");
}
}
使用示例
在需要使用的主类上添加
@RabbitListener(queues = "DirectQueue")//监听的队列名称 DirectQueue
配合websocket使用
/**
* @param id 发送给谁的id
* @param text 发送的内容
* @return {@link String}
*/
@GetMapping("/sendDirectMessage")
public String sendDirectMessage(@RequestParam Integer id,@RequestParam String text) {
String messageId = String.valueOf(id);
String messageData = text;
String createTime = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Map<String,String> map=new HashMap<>();
map.put("messageId",messageId);
map.put("messageData",messageData);
map.put("createTime",createTime);
if (WebSocket.isUserOnline(messageId)) {
// 用户在线,直接通过WebSocket发送消息
WebSocket webSocket = webSockets.stream()
.filter(ws -> messageId.equals(ws.userId))
.findFirst()
.orElse(null);
if (webSocket != null) {
webSocket.sendOneMessage(messageId, messageData);
}
} else {
// 用户不在线,将消息发送到RabbitMQ
rabbitTemplate.convertAndSend("DirectExchange", "DirectRouting", map);
}
return "ok";
}