第一步:创建一个发布者

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. HTML学习(4)属性

    属性是HTML元素提供的附加信息,大多数标签都能设置属性,一般位于开始标签,以名称/值的方式出现,例:name="value". 值要放在引号内(单引号.双引号都可以),如果值包含 ...

  2. Func<T,TResult>代理

    .NET平台已经发生了很多变化,最近决定好好的系统的学习一下了,开发做了这么多年,老实说很多时候都是在吃老本,这样下去不行的... 今天学习的是Func<T,TResult>,它是新的委托 ...

  3. JS高级---案例:贪吃蛇小游戏

    案例:贪吃蛇小游戏 可以玩的小游戏,略复杂,过了2遍,先pass吧 先创建构造函数,再给原型添加方法.分别创建食物,小蛇和游戏对象. 食物,小蛇的横纵坐标,设置最大最小值,运动起来的函数,按上下左右键 ...

  4. 生成树计数模板 spoj 104 (不用逆元的模板)

    /* 这种题,没理解,只是记一记如何做而已: 生成树的计数--Matrix-Tree定理 题目:SPOJ104(Highways) 题目大意: *一个有n座城市的组成国家,城市1至n编号,其中一些城市 ...

  5. 【资源分享】Half-Life(半条命)中英版

    *----------------------------------------------[下载区]----------------------------------------------* ...

  6. mtrace 简介

    内存泄露问题一般会再长时间运行的程序中暴露出来.而且一般很难定位和查找. linux 提供mtrace/muntrace来检测程序是否有内存泄露.一般来说要检测哪一段代码是否有内存泄露,就可以用这一对 ...

  7. 【读书笔记】--《编写高质量iOS与OS X代码的52个有效方法》

    1.Objective-C 起源: 在 C 语言基础上添加了面向对象特性,是 C 语言的超集.Objective-C 由 SmallTalk 语言演变过来,使用消息结构,运行环境由运行环境决定. OC ...

  8. java spring-boot 服务器启动参数设置

    java -jar -Xms5866m -Xmx5866m -Xss256k -Xloggc:/home/work/spring-boot/logs/gc-%t.log -XX:+UseGCLogFi ...

  9. shell脚本入门笔记

    转载:http://mp.weixin.qq.com/s?__biz=MzA3MTIxNzkyNg==&mid=204081791&idx=1&sn=27bb1d827e0f8 ...

  10. 不会PPT配色没关系,有这些配色网站,也能让你的PPT配色美到极致

    很多小伙伴在做PPT的时候,都会被PPT的配色难倒.看到各种非常好看的颜色总是想要将其用在自己的PPT中,可是却发现,颜色和颜色之间完全不搭,自己的PPT也变得丑到不像样. 别担心,今天将分享几个非常 ...