记一次Redis发布订阅与websocket联用
编程菜鸟,首次发帖,记录一下近期工作中使用到了redis的发布订阅模式。
项目要求使用websocket与后端交互,并且需要两个系统的应用同步,所以想到了使用redis的发布订阅模式来实现后端的数据实时同步功能。
消息生产者
public void sendMessage () {
Jedis resource = jedisPool.getResource();
resource.publish("你的频道","你的消息");
resource.close();
}
编写监听器
public class Listener extends JedisPubSub {
@Override
public void onMessage(String channel, String message) {
super.onMessage(channel, message);
// 此处可以接收到生产者推送的信息,并进行相关的操作
}
}
消费者
// 声明一个监听器
Listener listener = new Listener();
// 当页面连接时创建一个消费者线程
@OnOpen
public void onOpen (Session session, String msg) {
// 利用线程池创建一个消费者
ExecutorService thread = Executors
.newSingleThreadExecutor((r) -> new Thread(r,"线程名称"));
thread.submit(new Thread(() -> {
Jedis resource = jedisPool.getResource();
resource.subscribe(listener,"监听的频道名");
}));
// 消费者声明之后会一直保持阻塞状态,声明后立刻调用shutdown()方法
thread.shutdown();
}
// 页面关闭操作
@OnClose
public void onClose() throws IOException {
// 页面关闭时取消订阅某个频道,此时线程不再阻塞,任务结束,线程停止
listener.unsubscribe("监听的频道名");
}