redis的发布/阅订模式不了解的小伙伴可以看我的另一篇博客:
redis发布/订阅模式
这里就直接开始说明Java代码如何实现redis发布阅订的功能啦
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
阅订者代码
/**
* redis的消息处理器,当收到阅订的消息时,会将消息交给这个类处理
*/
@Component
public class RedisMessageListener implements MessageListener {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();
String msgBody = (String) stringRedisTemplate.getValueSerializer().deserialize(body);
System.out.println(MessageFormat.format("收到消息: <{0}>", msgBody));
byte[] channel = message.getChannel();
String msgChannel = (String) stringRedisTemplate.getValueSerializer().deserialize(channel);
System.out.println(MessageFormat.format("消息所在的通道: <{0}>", msgChannel));
String msgPattern = new String(pattern);
System.out.println(MessageFormat.format("匹配规则: <{0}>", msgPattern));
}
}
@Configuration
public class RedisConfig {
@Autowired
private RedisMessageListener redisMessageListener;
/**
* redis消息监听器容器
* 可以添加多个监听不同通道的redis监听器,只需要把消息监听器和相应的消息处理器绑定
* @param connectionFactory
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//订阅了一个叫demoChannel 的通道, 类似redis中的 subscribe 命令
container.addMessageListener(redisMessageListener, new ChannelTopic("demoChannel"));
//阅订匹配test*的通道, 类似redis中 psubscribe 命令
container.addMessageListener(redisMessageListener, new PatternTopic("test*"));
return container;
}
}
发布者代码
@RestController
public class PublishController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 向通道中发布消息
* @param channel 通道名
* @param message 消息内容
* @return
*/
@GetMapping("/publish/{channel}")
public String publish(@PathVariable String channel, String message) {
//向通道中发送通知
stringRedisTemplate.convertAndSend(channel, message);
return "success";
}
}
测试效果
将我们的服务跑起来,然后分别在浏览器上输入下面两个url
http://localhost:8080/publish/test?message=hello
http://localhost:8080/publish/demoChannel?message=hello
控制台输出如下
如果对redis发布/阅订比较熟悉的小伙伴一定会发现,这几个打印出来的变量,其实也就是redis中每次收到阅订消息时会输出的内容