第一步:创建一个发布者

package work;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; /**
* 发布
* author:songyan
* date: 2019/10/17
**/
public class Publisher extends Thread {
private final JedisPool jedisPool;
private String chanelName; public Publisher(JedisPool jedisPool, String chanelName) {
this.jedisPool = jedisPool;
this.chanelName = chanelName;
System.out.println("【发布者\""+chanelName+"\"初始化成功】");
System.out.println("请输入要发布的消息:");
} @Override
public void run() {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Jedis jedis = jedisPool.getResource();
while (true) {
String line = null;
try {
line = reader.readLine();
if (!"quit".equals(line)) {
System.out.println(chanelName+"发布消息成功");
jedis.publish(chanelName, line);
} else {
break;
}
} catch (IOException e) {
e.printStackTrace();
} }
}
}

第二步:创建一个订阅者的监听器

package work;

import redis.clients.jedis.JedisPubSub;

/**
* 监听
* author:songyan
* date: 2019/10/17
**/
public class SubscriberListener extends JedisPubSub {
private String subName;
public SubscriberListener(String subName) {
this.subName = subName;
} // 取得订阅的消息后的处理
public void onMessage(String channel, String message) {
System.out.println(String.format("【"+subName + "接收到消息】频道:%s;消息:%s。" , channel , message));
} // 初始化订阅时候的处理
public void onSubscribe(String channel, int subscribedChannels) {
System.out.println(String.format( "【"+subName + "订阅频道成功】频道:%s;频道数:%d。" , channel , subscribedChannels));
} // 取消订阅时候的处理
public void onUnsubscribe(String channelName, int subscribedChannels) {
System.out.println(String.format( "【"+subName + "取消订阅】频道:%s;频道数:%d。",channelName , subscribedChannels));
}
}

第三步:创建一个订阅者

package work;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool; /**
* 订阅
* author:songyan
* date: 2019/10/17
**/
public class Subscriber extends Thread {
//jedis连接池
private final JedisPool jedisPool; private final SubscriberListener subscriberListener; private String channelName; public Subscriber(JedisPool jedisPool, SubscriberListener subscriberListener, String channelName) {
super();
this.jedisPool = jedisPool;
this.subscriberListener = subscriberListener;
this.channelName = channelName;
} @Override
public void run() {
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
jedis.subscribe(subscriberListener,channelName);// 通过jedis.subscribe()方法去订阅,入参是1.订阅者、2.频道名称
} catch (Exception e) {
e.printStackTrace();
System.out.println(String.format("频道订阅失败:%s",e));
} finally {
if (null != jedis)
jedis.close();
}
}
}

第四步:测试(编写客户端)

(1)发布者客户端

package work.test;

import redis.clients.jedis.JedisPool;
import work.Publisher; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; /**
* 发布测试
* author:songyan
* date: 2019/10/17
**/
public class PublishClient {
public static void main(String[] args) throws InterruptedException {
//创建连接池
JedisPool jedisPool = new JedisPool("192.168.159.133");
//创建线程池,并设定线程数量
ExecutorService executorService = Executors.newFixedThreadPool(5);
//创建一个发布者
Publisher publisher = new Publisher(jedisPool,"发布者1");
executorService.submit(publisher);
executorService.shutdown();
executorService.awaitTermination(600, TimeUnit.SECONDS);
}
}

执行main方法,创建一个发布者。

(2)订阅者客户端

package work.test;

import redis.clients.jedis.JedisPool;
import work.Subscriber;
import work.SubscriberListener; import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit; /**
* 订阅者客户端
* author:songyan
* date: 2019/10/17
**/
public class SubscriberClient { public static void main(String[] args) throws InterruptedException {
//创建redis连接池
JedisPool jedisPool = new JedisPool("192.168.159.133");
//创建线程池
ExecutorService executorService = Executors.newFixedThreadPool(5); //创建订阅者
final SubscriberListener subscriberListener = new SubscriberListener("订阅者一号");
//订阅频道
Subscriber subscriber = new Subscriber(jedisPool, subscriberListener, "发布者1");
executorService.submit(subscriber);
executorService.shutdown();
executorService.awaitTermination(60, TimeUnit.SECONDS); //30s后取消订阅
Thread.sleep(3000);
subscriberListener.onUnsubscribe("发布者1", 0);
}
}

执行main方法,创建一个订阅者(订阅上面发布者的频道)。

发布者发布信息:

订阅者接收到订阅信息:

订阅者取消订阅:

扩展:ExecutorService

Jedis实现频道的订阅,取消订阅的更多相关文章

  1. Redis的频道发布与消息订阅

    Redis的频道发布与消息订阅 官网介绍 进程间的一种通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. 订阅/发布消息图 下图展示了频道channel1,以及订阅这个频道的三个客户端-c ...

  2. Firefox取消“订阅实时书签”功能

    如果你勾选了Firefox“总是用实时书签订阅收取”, 一打开RSS页面就直接弹出添订阅实时书签对话,而当你想在火狐中直接查看RSS页面时,发现不知如何取消“订阅实时书签”功能了.就怨这个关闭功能藏的 ...

  3. MQTT——取消订阅报文和断开连接报文

    笔者已经把连接报文,订阅报文,发布报文都讲解了完了.而接下来就是取消订阅报文和断开连接报文.和其他的报文比较的话,他们显示非常简单.甚至笔者觉得可以不必要拿出来讲.只要看一下MQTT文档就没有什么不清 ...

  4. RxJava2 中多种取消订阅 dispose 的方法梳理( 源码分析 )

    Github 相关代码: Github地址 一直感觉 RxJava2 的取消订阅有点混乱, 这样也能取消, 那样也能取消, 没能系统起来的感觉就像掉进了盘丝洞, 迷乱… 下面说说这几种情况 几种取消的 ...

  5. 如何取消 Google Cloud Platform 试用 & 关闭 GCP 帐号 & 删除信用卡 & 取消订阅

    如何取消 Google Cloud Platform 试用 & 关闭 GCP 帐号 & 删除信用卡 & 取消订阅 关闭您的 Google Cloud Platform 帐号 s ...

  6. ecshop邮件订阅按“订阅”没反应

    原订阅邮件所使用的JS文件transport.js和JQuery冲突,会更改transport.js文件,用以下代码可同样实现订阅功能. <input type="text" ...

  7. 使用SQLServer同义词和SQL邮件,解决发布订阅中订阅库丢失数据的问题

    最近给客户做了基于SQLServer的发布订阅的“读写分离”功能,但是某些表数据很大,经常发生某几条数据丢失的问题,导致订阅无法继续进行.但是每次发现问题重新做一次发布订阅又非常消耗时间,所以还得根据 ...

  8. Replication--使用备份初始化订阅--请求订阅

    1. 修改发布属性"许从备份文件初始化"置为TRUE 脚本修改:USE [DB01]GODECLARE @publication AS sysnameSET @publicatio ...

  9. Redis 订阅发布 - Jedis实现

    Redis 订阅发布 - Jedis实现 我想到使用Redis的订阅发布模式是用来解决推送问题的-. 对于概念性的叙述,多多少少还是要提一下的: ​ 什么是Redis发布订阅?Redis发布订阅是一种 ...

随机推荐

  1. AC3 overview

    1.AC3 encode overview AC3 encoder的框图如下: AC3在频域采用粗量化(coarsely quantizing)来获取较高的压缩率. 1).输入PCM 经过MDCT变换 ...

  2. (c#)独一无二的出现次数

    题目 解

  3. 每天进步一点点------下载Microblaze程序到Flash

    第一步 生成下载文件(bit文件) 选择之前的工作目录,打开SDK.点击Program FPGA图标. 将bootloop项改为Hello_World.elf.点击Program.此时可以不用连接下载 ...

  4. Unity手机端手势基本操作

    主要有单指移动3D物体.单指旋转3D物体.双指缩放3D物体. 基类 using UnityEngine; using System.Collections; /// <summary> / ...

  5. Vue - 动态组件 & 异步组件

    动态组件 <div id="app"> <components :is="com[2]"></components> < ...

  6. Python 数据分析实战 | 用数据带你回顾乔丹的职业生涯

    乔丹是联盟上下公认的历史第一人,芝加哥公牛在他带领下几乎统治了上世纪 90 年代 NBA 整整 10 年,包括分别在 91-93 赛季和 96-98 赛季拿下的两次三连冠,要知道,NBA72 年历史上 ...

  7. 关于Sublime如何配置C++环境的问题

    前言 传说sublime是全球最好的编辑器,可是只是编辑器啊!!!如果要运行,对于我们这些蒟蒻来说,不得不去使用DEV_C++.我们总是幻想能让sublime变成一个轻量级IDE,那该多好啊!!! 那 ...

  8. Sass&Scss入门 选择器 混合器 导入 条件判断 迭代

    Sass 基于ruby的一种将脚本解析成CSS的脚本语言.也可以说是一种预处理语言. Sass在css的语法基础上增加了变量.嵌套.混合.继承.导入等高级功能. 使用Sass与Sass样式库(如com ...

  9. SpringMVC的三种处理器适配器

    SpringMVC具有三种处理器适配器,他们分别是BeanNameUrlHandlerMapping.SimpleControllerHandlerAdapter.ControllerClassNam ...

  10. yii2之ActiveRecord 模型

          Active Record 模型是一种设计模式,用面向对象的方式抽象地访问数据的模式.在 Yii2 中,每一个 Active Record 模型对象的实例是 yii\db\ActiveRe ...