1. 导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.18.0</version>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.23</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2. 实体类
package com.itheima.pojo;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class User {
private String id;
private String name;
}
3. 发布消息监听器
package com.itheima.publish;
import cn.hutool.json.JSONUtil;
import com.itheima.pojo.User;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Slf4j
@Component
public class PublishListener {
@Resource
private RedissonClient redisson;
public static String CHAT_MSG_TOPIC = "CHAT_MSG_TOPIC";
private RTopic topic;
/**
* 开启监听
*/
@PostConstruct
void openReceiving() {
topic = redisson.getTopic(CHAT_MSG_TOPIC);
}
/**
* 业务需要的地方可以直接调用
*/
public void sendMsg(User user) {
//redis 发广播
try {
String alarmStr = JSONUtil.toJsonPrettyStr(user);
topic.publish(alarmStr);
} catch (Exception e) {
log.error("sendNotice失败:", e);
}
}
}
4. 订阅消息监听器
package com.itheima.subscribe;
/**
* 告警监听器
*
*/
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
@Slf4j
@Component
public class SubscribeListener {
@Resource
private RedissonClient redisson;
public static String CHAT_MSG_TOPIC = "CHAT_MSG_TOPIC";
private RTopic topic;
/**
* 开启监听
*/
@PostConstruct
void openReceiving() {
topic = redisson.getTopic(CHAT_MSG_TOPIC);
log.info("监听 CHAT_MSG_TOPIC 成功:{}", topic);
topic.addListener(String.class, (charSequence, msgStr) -> {
if (StrUtil.isNotEmpty(msgStr) && JSONUtil.isTypeJSON(msgStr)) {
System.out.println(charSequence);
System.out.println(msgStr);
}
});
}
}
5. 测试
@RestController
@RequestMapping("/test")
public class TestController {
@Resource
private PublishListener publishListener;
@RequestMapping("/hello")
public void hello(){
User user = new User()
.setId("1")
.setName("张三");
publishListener.sendMsg(user);
}
}
访问:
http://localhost:8080/test/hello
结果:
CHAT_MSG_TOPIC
{
"id": "1",
"name": "张三"
}