java redis pubsub_如何从Java中的生菜RedisPubSubListener获取消息?
你开了个好头. 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获取消息?相关推荐
- java redis管道_Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍
jedis是一个著名的key-value存储系统,而作为其官方推荐的java版客户端jedis也非常强大和稳定,支持事务.管道及有jedis自身实现的分布式. 在这里对jedis关于事务.管道和分布式 ...
- 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 ...
- java redis缓存理解_Java项目中使用Redis缓存案例
缓存的目的是为了提高系统的性能,缓存中的数据主要有两种: 1.热点数据.我们将经常访问到的数据放在缓存中,降低数据库I/O,同时因为缓存的数据的高速查询,加快整个系统的响应速度,也在一定程度上提高并发 ...
- java redis hash_我爱java系列---【redis中如何存取hash类型的值(key field value)】
@Servicepublic class CartServiceImpl implementsCartService {private static final String CART="C ...
- java redis工具类_redis Java工具类详解
redis 工具 [Java]代码 private static ShardedJedisPool sharedJedisPool; public synchronized static void i ...
- java读取服务器图片大小,SpringMVC中MultipartFile上传获取图片的宽度和高度详解
SpringMVC一般使用MultipartFile来做文件的上传,通过MultipartFile的getContentType()方法判定文件的类型(MIME) ".doc":& ...
- java 接受传感器的数据_java中调用第三方接口获取数据的方式
//get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...
- java redis 下载_redis Java源代码 redis.rar - 下载 - 搜珍网
压缩包 : redis.rar 列表 redis/.classpath redis/.mymetadata redis/.project redis/.settings/.jsdtscope redi ...
- java redis释放连接_redis在应用中使用连接不释放问题解决
今天测试,发现redis使用的时候,调用的链接一直不释放.后查阅蛮多资料,才发现一个配置导致的.并不是他们说的服务没有启动导致的. 1)配置文件 #redis连接配置================= ...
最新文章
- React + Typescript + Webpack 开发环境配置
- oracle存储过程的基本语法
- 目标检测R-CNN模型的CNN模块微调过程分析【全网最易懂】
- jquery实现99乘法表的动态显示
- 循环冗余校验码CRC,求解步骤
- 如何安全的停止一个线程
- IOS Core Animation Advanced Techniques的学习笔记(五)
- LightOJ 1370 - Bi-shoe and Phi-shoe
- Zookeeper基于Java 访问
- Lambda表达式有参数有返回值的练习
- 【TypeScript系列教程02】安装及使用
- 【jQuery笔记Part1】03-jQuery加载模式对比JS
- 什么是视频数据结构化?
- 常见电脑蓝屏代码以及解决办法
- 关于Shader wants normals, but the mesh doesn't have them的问题
- CV | 运动目标检测 之 背景差分法
- 瑞星微RK3288 开发板(ARM Cortex-A17架构)
- Api --String知识点
- 前缀树(Trie树)
- 数风流人物,还看今朝(记通用产品射箭团队活动)