Redis: Jedis 源代码剖析2- 发布者/订阅者模式剖析

本文深入剖析Jedis的发布者/订阅者模式,重点探讨JedisPubSub类的角色。在订阅通道后,JedisPubSub会进行消息轮询,直到取消订阅。由于Jedis的单线程特性,订阅后线程会持续循环,需在接收到消息后新开线程处理任务。要实现功能,需要继承抽象类JedisPubSub并重写相关方法。
摘要由CSDN通过智能技术生成


在Jedis提供的发布者/订阅者模式中,最重要的就是JedisPubSub . 当订阅通道后,JedisPubSub就会轮询通道。直到通道取消订阅,才会继续执行。

因为Jedis是单线程,所以当订阅之后,线程就在循环。除非,在JedisPubSub收到消息后,新开线程继续执行任务。


在JedisPubSub 类中定义了接受消息后触发事件和轮询代码。JedisPubSub类是抽象类,所以为了实现自己的功能,必须继承该类。


public abstract class JedisPubSub {
  private int subscribedChannels = 0;
  private volatile Client client;

  public void onMessage(String channel, String message) {
  }

  public void onPMessage(String pattern, String channel, String message) {
  }

  public void onSubscribe(String channel, int subscribedChannels) {
  }

  public void onUnsubscribe(String channel, int subscribedChannels) {
  }

  public void onPUnsubscribe(String pattern, int subscribedChannels) {
  }

  public void onPSubscribe(String pattern, int subscribedChannels) {
  }

  public void unsubscribe() {
    if (client == null) {
      throw new JedisConnectionException("JedisPubSub was not subscribed to a Jedis instance.");
    }
    client.unsubscribe();
    client.flush();
  }

  public void unsubscribe(String... channels) {
    if (client == null) {
      throw new JedisConnectionException("JedisPubSub is not subscribed to a Jedis instance.");
    }
    client.unsubscribe(channels);
    client.flush();
  }

  public void subscribe(String... channels) {
    if (client == null) {
      throw new JedisConnectionException("JedisPubSub is not subscribed to a Jedis instance.");
    }
    client.subscribe(channels);
    client.flush();
  }

  public void psubscribe(String... patterns) {
    if (client == null) {
      throw new JedisConnectionException("JedisPubSub is not subscribed to a Jedis insta
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值