1、安装、配置等步骤在点对点模式中已写过,这里直接上代码

2、首先修改配置文件中的模式设置为订阅模式,代码如下:

pub-sub-domain: true

3、发送一条学校通知到通知话题中,或队列中,代码如下:

@RequestMapping(value = "/send")
public Object sendClassMessage() {
// 创建消息体
Map<String,String> messageMap = new HashMap<>();
messageMap.put("classId", "三年一班");
messageMap.put("message", "由于疫情原因,我班于2020年3月20日开始线上正式上课");
messageMap.put("classTable", "Image.jpg");
//发布、订阅模式,发送方式与点对点模式相同 Spring boot会根据配置文件中是否采用topic模式,选择是创建队列还是创建主题
messagingTemplate.convertAndSend("class_message", JSONObject.toJSONString(messageMap));
//需要引入fastjson依赖
return JSON.parseObject("{\"message\":\"push a message success\",\"messageCode\":200}");
}

4、创建三个家长去订阅class_message话题中的消息,代码如下:

/**
* 三年一班A学生家长
* @param message 接收到的消息,此参数会自动注入
* @return 反馈给老师的信息
* */
@JmsListener(destination = "class_message")
@SendTo("system_return")
public Object listenOne(String message){
return getMessage(message, "三年一班A学生家长", "三年一班");
}

/**
* 三年一班B学生家长
* @param message 接收到的消息,此参数会自动注入
* @return 反馈给老师的信息
* */
@JmsListener(destination = "class_message")
@SendTo("system_return")
public Object listenTwo(String message){
return getMessage(message, "三年一班B学生家长", "三年一班");
}

/**
* 三年二班A学生家长
* @param message 接收到的消息,此参数会自动注入
* @return 反馈给老师的信息
* */
@JmsListener(destination = "class_message")
@SendTo("system_return")
public Object listenThree(String message){
return getMessage(message, "三年二班B学生家长", "三年二班");
}

private String getMessage(String message, String student, String classId) {
Map mapMessage = JSONObject.parseObject(message, Map.class);
if (mapMessage.get("classId").equals(classId)) {
System.out.println("【" + student + "】收到消息:" + mapMessage.get("message"));
return student + "已收到消息";
}
return null;
}

其中,有俩个是对应通知班级的学生家长,另一个不是,我们通过代码控制其收不到消息,收到消息的同时,会反馈给系统队列,已接收的信息

注意:如上如果消费者是三年二班的学生家长,在我们业务代码识别之后,会给null,那么此时的null是代表不发送消息,而不是发送null这个消息给队列

5、系统打印或者记录该通知的接收情况,代码如下:

/**
* 学校系统记录收到消息的家长列表
* */
@JmsListener(destination = "system_return")
public void returnMsg(String message){
System.out.println("【系统反馈】 " + message);
}

6、运行测试,结果如下:

【三年一班A学生家长】收到消息:由于疫情原因,我班于2020年3月20日开始线上正式上课
 【三年一班B学生家长】收到消息:由于疫情原因,我班于2020年3月20日开始线上正式上课
 【系统反馈】 三年一班B学生家长已收到消息
 【系统反馈】 三年一班A学生家长已收到消息

从结果可以看到,只有对应班级的俩个学生家长收到了消息,另一个是没有收到消息及系统反馈的。