名词解释:
exchange: 交换机,决定了消息路由规则;
queue: 消息队列;
channel: 进行消息读写的通道;
bind: 绑定了Queue和Exchange,即为符合什么样路由规则的消息,将会放置入哪一个消息队列;
根据具体业务需求,选择不同的方式去订阅。例如exchange则是连接到一个交换机,这个交换机决定消息路由的具体规则,exchange可以分为以下几类:
- 完全根据key进行投递的叫做Direct交换机;
- 对key进行模式匹配后进行投递的叫做Topic交换机;
- 还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列;
1、后端像前端发送消息
import org.springframework.amqp.rabbit.core.RabbitTemplate;
public class TestController {
@Autowired
private RabbitTemplate rabbitTemplate;
@GetMapping("test")
public void test() {
JSONObject params = new JSONObject();
params.put("actualPrice", "123456");
//定义一个队列;
Queue queue = new Queue("ActualPriceBusEvent");
//声明一个fanout类型的交换机
FanoutExchange fanoutExchange = new FanoutExchange("jeecg.fanout.exchange");
//将交换机和队列绑定一起
BindingBuilder.bind(queue).to(fanoutExchange);
//群发消息;jeecg.fanout.exchange是交换机名称;
rabbitTemplate.convertAndSend("jeecg.fanout.exchange", "",
params.toJSONString());
}
}
2、前端:https://www.cnblogs.com/tcz1018/p/14102505.html
/*前台订阅频道时要写清楚交换机的路径,否则,无法接收消息,或只有一台客户机能接收消息。如果不清楚具体路径,浏览器控制台里可以看到:
>>> SUBSCRIBE
id:sub-0
destination:/
destination就是具体的路径了;
*/
import Stomp from "stompjs";
this.client = Stomp.client(this.mqttService);
//----------消息总线方法------------------
mqtthuoquMsg() {
//初始化连接
const headers = {
login: this.mqttUsername,
passcode: this.mqttPassword,
};
//进行连接
this.client.connect(headers.login, headers.passcode, this.onConnected, this.onFailed, this.virtualHost);
},
onConnected: function () {
//订阅频道
this.client.subscribe('/exchange/交换机名称/队列名', this.responseCallback, this.onFailed);
},
onFailed: function (frame) {
this.$toast('获取实时积分单价失败')
},
// 回传消息
responseCallback: function (frame) {
//接收消息处理
var price = JSON.parse(frame.body).actualPrice
//处理自己业务逻辑
},
// 断开相应的连接
close: function () {
this.client.disconnect(function () {
console.log("已退出账号");
})
},