附demo源码:
https://download.csdn.net/download/qq_43560721/12630383
demo结构:
demo解析:
最简单的理解便是有一些人订阅了你,当你发布消息时,就可以推送消息给这些人。
1.引入依赖
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
2.建立发布者
package cn.xxs.redismess.chat;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class ChatRelease extends Thread{
private final JedisPool jedisPool;
private String mess;
private String channel;
public ChatRelease(JedisPool jedisPool,String mess,String channel) {
this.jedisPool = jedisPool;
this.mess = mess;
this.channel = channel;
}
@Override
public void run() {
Jedis jedis = jedisPool.getResource(); //连接池中取出一个连接
jedis.publish(channel, mess); //从 channel 的频道上推送消息
}
}
3.建立订阅者及订阅频道
package cn.xxs.redismess.chat;
import cn.xxs.redismess.chat.service.ChatService;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPubSub;
import javax.annotation.Resource;
public class ChatSubscriber extends JedisPubSub implements Runnable{
private JedisPool jedisPool;
private String channel ;
public ChatSubscriber(JedisPool jedisPool,String channel) {
this.jedisPool = jedisPool;
this.channel = channel;
}
@Override
public void onMessage(String channel, String message) { //收到消息会调用
System.out.println("收到来自频道"+channel + "的消息:" + message);
}
@Override
public void onSubscribe(String channel, int subscribedChannels) { //订阅了频道会调用
System.out.println("订阅了频道:"+channel);
}
@Override
public void onUnsubscribe(String channel, int subscribedChannels) { //取消订阅 会调用
System.out.println("取消订阅频道:"+channel);
}
@Override
public void run() {
System.out.println();
Jedis jedis = null;
try {
jedis = jedisPool.getResource(); //取出一个连接
jedis.subscribe(this, channel); //通过subscribe 的api去订阅,入参是订阅者和频道名
} catch (Exception e) {
System.out.println(String.format("error, %s", e));
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
4.新建controller
package cn.xxs.redismess.chat;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
@RestController
@RequestMapping("/user")
public class ChatController {
// public String mess ;
// public ChatController(String mess) {
// this.mess = mess;
// }
/**
* 发布消息
* @param mess
* @param channel
* @return
*/
@RequestMapping("/release")
@ResponseBody
public String release(String mess,String channel) {
// 连接redis服务端
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
ChatRelease chatRelease = new ChatRelease(jedisPool, mess, channel);
chatRelease.start();
return "success";
}
/**
* 订阅频道
* @param channel
* @return
*/
@RequestMapping("/subscribe")
@ResponseBody
public String subscribe(String channel) {
// 连接redis服务端
JedisPool jedisPool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379);
new Thread(new ChatSubscriber(jedisPool,channel)).start();
return "success";
}
}
5.postman测试
首先我们可以先订阅一个频道 test
调取成功,控制台打印如下:
然后我们可以发布消息,注意额,test频道发布消息,订阅者才会收到推送: