你开了个好头. Redis Pub / Sub涉及至少两方:

>订阅者

>和出版商

订阅者(猜测并不奇怪)订阅频道,模式或两者.

发布者将消息发布到频道.此设置也需要反映在您的代码中.

我使用RedisPubSubAdapter扩展了你的代码,因此代码不需要实现所有方法,只需要我们感兴趣的方法,比如message(channel,message):

RedisClient client = RedisClient.create("redis://" + host + "/0");

StatefulRedisPubSubConnection con = client.connectPubSub();

RedisPubSubListener listener = new RedisPubSubAdapter() {

@Override

public void message(String channel, String message) {

System.out.println(String.format("Channel: %s, Message: %s", channel, message));

}

};

con.addListener(listener);

RedisPubSubCommands sync = con.sync();

sync.subscribe("channel");

一旦添加了监听器并且客户端订阅了一个频道,它就可以接收发布/订阅消息了.当通知到达时,生菜会调用听众的方法.此时,重要的是要了解通知是在I / O线程上处理的,该线程与设置客户端和订阅的线程不同.

让我们来发送方.要向您的频道发送消息,您需要一个额外的连接(或者使用redis-cli并发出PUBLISH频道消息).

StatefulRedisConnection sender = client.connect();

sender.sync().publish("channel", "Message 1");

sender.sync().publish("channel", "Message 2");

Redis将在名为channel的频道上发布消息1和消息1(不是广告素材名称,但它现在可以完成这项工作).

如果你连续执行代码并在发送一条消息后稍等一下,那么你很有可能通知监听器并且你看到一些系统输出如:

Channel: channel, Message: Message 1

Channel: channel, Message: Message 2

异步:有什么影响?

现在是异步性的棘手部分.在某些情况下使用异步通信是有益的,但增加了复杂性如果您可以在结果到达之前完成工作(某些计算直到您需要结果),或者您只想启动I / O并释放您正在处理的线程.服务器应用程序是异步模式的良好环境.典型的服务器具有有限的线程资源,并且它一直运行直到它关闭.在服务器启动时,您将注册订阅.一旦消息进入,它就会在I / O线程上处理,并且会调用您的侦听器

在独立应用程序中使用异步命令执行(比如一个简单的主程序)时,您就有了顺序流程.异步消息传递将导致程序在代码流完成后退出.这并不一定意味着接收或处理了发布/订阅消息.如果你在main中逐个运行两个代码块,你很可能根本看不到任何输出,因为程序终止的速度比I / O可能发生的要快.现在同步发挥作用.如何处理同步有很多可能性,但现在让我们看看两种替代方案:

> CountDownLatch:在发布程序流之前需要执行许多操作

> Thread.sleep(…):等待几毫秒

CountDownLatch使用

final CountDownLatch latch = new CountDownLatch(2);

RedisPubSubListener listener = new RedisPubSubAdapter() {

@Override

public void message(String channel, String message) {

System.out.println(String.format("Channel: %s, Message: %s", channel, message));

latch.countDown();

}

};

// ...

sender.sync().publish("channel", "Message 2");

latch.await();

在上面的代码中,CountDownLatch被设置为倒计时两次(latch.countDown()).调用latch.await()会阻塞主线程(程序流)并使其等待,直到CountDownLatch倒计时,从而释放程序以继续.

Thread.sleep(…)使用

RedisPubSubListener listener = new RedisPubSubAdapter() {

@Override

public void message(String channel, String message) {

System.out.println(String.format("Channel: %s, Message: %s", channel, message));

}

};

con.addListener(listener);

RedisPubSubCommands sync = con.sync();

sync.subscribe("channel");

StatefulRedisConnection sender = client.connect();

sender.sync().publish("channel", "Message 1");

sender.sync().publish("channel", "Message 2");

latch.await();

Thread.sleep(1000);

此代码使用Thread.sleep(1000);等待一秒钟(在主线程上).这应该足以接收消息.不要这样做.这种方法快速而且很脏,可能适合播放和调试,但在合理的代码中避免使用Thread.sleep.

有两个参与者的事情

Redis对订阅频道/模式的连接施加约束:一旦订阅,您只能执行SUBSCRIBE,PSUBSCRIBE,UNSUBSCRIBE,PUNSUBSCRIBE,PING和QUIT命令.不允许在该连接上执行PUBLISH.因此,您需要使用其他连接.

java redis pubsub_如何从Java中的生菜RedisPubSubListener获取消息?相关推荐

  1. java redis管道_Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

    jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...

  2. java redis集群操作,java操作redis3.0集群

    java(JedisCluster)操作redis集群 这里只是几个简单的demo,直接上代码吧,没啥好说的 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  3. java redis缓存理解_Java项目中使用Redis缓存案例

    缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...

  4. java redis hash_我爱java系列---【redis中如何存取hash类型的值(key field value)】

    @Servicepublic class CartServiceImpl implementsCartService {private static final String CART="C ...

  5. java redis工具类_redis Java工具类详解

    redis 工具 [Java]代码 private static ShardedJedisPool sharedJedisPool; public synchronized static void i ...

  6. java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解

    SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME) ".doc":& ...

  7. java 接受传感器的数据_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  8. java redis 下载_redis Java源代码 redis.rar - 下载 - 搜珍网

    压缩包 : redis.rar 列表 redis/.classpath redis/.mymetadata redis/.project redis/.settings/.jsdtscope redi ...

  9. java redis释放连接_redis在应用中使用连接不释放问题解决

    今天测试,发现redis使用的时候,调用的链接一直不释放.后查阅蛮多资料,才发现一个配置导致的.并不是他们说的服务没有启动导致的. 1)配置文件 #redis连接配置================= ...

最新文章

  1. React + Typescript + Webpack 开发环境配置
  2. oracle存储过程的基本语法
  3. 目标检测R-CNN模型的CNN模块微调过程分析【全网最易懂】
  4. jquery实现99乘法表的动态显示
  5. 循环冗余校验码CRC,求解步骤
  6. 如何安全的停止一个线程
  7. IOS Core Animation Advanced Techniques的学习笔记(五)
  8. LightOJ 1370 - Bi-shoe and Phi-shoe
  9. Zookeeper基于Java 访问
  10. Lambda表达式有参数有返回值的练习
  11. 【TypeScript系列教程02】安装及使用
  12. 【jQuery笔记Part1】03-jQuery加载模式对比JS
  13. 什么是视频数据结构化?
  14. 常见电脑蓝屏代码以及解决办法
  15. 关于Shader wants normals, but the mesh doesn't have them的问题
  16. CV | 运动目标检测 之 背景差分法
  17. 瑞星微RK3288 开发板(ARM Cortex-A17架构)
  18. Api --String知识点
  19. 前缀树(Trie树)
  20. 数风流人物,还看今朝(记通用产品射箭团队活动)

热门文章

  1. JZOJ5197 C
  2. 【VB6 Gdi+进阶】序章
  3. Havel-Hakimi定理 POJ1659
  4. [SQL入门级] 上篇被移出园子首页,那这篇咱就'薄利多销'
  5. 什么样的男人才是最牛的男人
  6. Ajax 滚动异步加载数据
  7. go url 参数编码和解码
  8. OSI模型七层模型结构
  9. 黄聪:WordPress图片插件:Auto Highslide修改版(转)
  10. GNUstep 运行gui程序