聊聊claudb的pubsub command
时间:2022-07-24
本文章向大家介绍聊聊claudb的pubsub command,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下claudb的pubsub command
PublishCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PublishCommand.java
@Command("publish")
@ParamLength(2)
public class PublishCommand implements DBCommand, SubscriptionSupport, PatternSubscriptionSupport {
@Override
public RedisToken execute(Database db, Request request) {
String channel = request.getParam(0).toString();
SafeString message = request.getParam(1);
return integer(publishAll(getClauDB(request.getServerContext()), channel, message));
}
private int publishAll(DBServerContext server, String channel, SafeString message) {
int count = publish(server, channel, message);
int pcount = patternPublish(server, channel, message);
return count + pcount;
}
}
- PublishCommand实现了DBCommand, SubscriptionSupport, PatternSubscriptionSupport接口,其execute方法执行publishAll(getClauDB(request.getServerContext()), channel, message)
SubscribeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/SubscribeCommand.java
@ReadOnly
@Command("subscribe")
@ParamLength(1)
@PubSubAllowed
public class SubscribeCommand implements DBCommand, SubscriptionSupport {
private static final String SUBSCRIBE = "subscribe";
@Override
public RedisToken execute(Database db, Request request) {
Database admin = getAdminDatabase(request.getServerContext());
String sessionId = getSessionId(request);
Sequence<SafeString> channels = getChannels(request);
int i = channels.size();
List<Object> result = new LinkedList<>();
for (SafeString channel : request.getParams()) {
addSubscription(admin, sessionId, channel);
getSessionState(request.getSession()).addSubscription(channel);
result.addAll(asList(SUBSCRIBE, channel, ++i));
}
return convert(result);
}
private String getSessionId(Request request) {
return request.getSession().getId();
}
private Sequence<SafeString> getChannels(Request request) {
return getSessionState(request.getSession()).getSubscriptions();
}
}
- SubscribeCommand实现了DBCommand, SubscriptionSupport接口,其execute方法遍历channel挨个执行addSubscription及getSessionState(request.getSession()).addSubscription(channel)
UnsubscribeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/UnsubscribeCommand.java
@ReadOnly
@Command("unsubscribe")
@ParamLength(1)
@PubSubAllowed
public class UnsubscribeCommand implements DBCommand, SubscriptionSupport {
private static final String UNSUBSCRIBE = "unsubscribe";
@Override
public RedisToken execute(Database db, Request request) {
Database admin = getAdminDatabase(request.getServerContext());
String sessionId = getSessionId(request);
Sequence<SafeString> channels = getChannels(request);
int i = channels.size();
List<Object> result = new LinkedList<>();
for (SafeString channel : request.getParams()) {
removeSubscription(admin, sessionId, channel);
getSessionState(request.getSession()).removeSubscription(channel);
result.addAll(asList(UNSUBSCRIBE, channel, --i));
}
return convert(result);
}
private String getSessionId(Request request) {
return request.getSession().getId();
}
private Sequence<SafeString> getChannels(Request request) {
return getSessionState(request.getSession()).getSubscriptions();
}
}
- UnsubscribeCommand实现了DBCommand, SubscriptionSupport接口,其execute方法遍历channel挨个执行removeSubscription(admin, sessionId, channel)及getSessionState(request.getSession()).removeSubscription(channel)
PatternSubscribeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PatternSubscribeCommand.java
@ReadOnly
@Command("psubscribe")
@ParamLength(1)
@PubSubAllowed
public class PatternSubscribeCommand implements DBCommand, PatternSubscriptionSupport {
private static final String PSUBSCRIBE = "psubscribe";
@Override
public RedisToken execute(Database db, Request request) {
Database admin = getAdminDatabase(request.getServerContext());
String sessionId = getSessionId(request);
Sequence<SafeString> channels = getChannels(request);
int i = channels.size();
List<Object> result = new LinkedList<>();
for (SafeString pattern : request.getParams()) {
addPatternSubscription(admin, sessionId, pattern);
getSessionState(request.getSession()).addSubscription(pattern);
result.addAll(asList(PSUBSCRIBE, pattern, ++i));
}
return convert(result);
}
private String getSessionId(Request request) {
return request.getSession().getId();
}
private Sequence<SafeString> getChannels(Request request) {
return getSessionState(request.getSession()).getSubscriptions();
}
}
- PatternSubscribeCommand实现了DBCommand, PatternSubscriptionSupport接口,其execute方法遍历pattern挨个执行addPatternSubscription(admin, sessionId, pattern)及getSessionState(request.getSession()).addSubscription(pattern)
PatternUnsubscribeCommand
claudb-1.7.1/src/main/java/com/github/tonivade/claudb/command/pubsub/PatternUnsubscribeCommand.java
@ReadOnly
@Command("punsubscribe")
@ParamLength(1)
@PubSubAllowed
public class PatternUnsubscribeCommand implements DBCommand, PatternSubscriptionSupport {
private static final String PUNSUBSCRIBE = "punsubscribe";
@Override
public RedisToken execute(Database db, Request request) {
Database admin = getAdminDatabase(request.getServerContext());
String sessionId = getSessionId(request);
Sequence<SafeString> channels = getChannels(request);
int i = channels.size();
List<Object> result = new LinkedList<>();
for (SafeString channel : request.getParams()) {
removePatternSubscription(admin, sessionId, channel);
getSessionState(request.getSession()).removeSubscription(channel);
result.addAll(asList(PUNSUBSCRIBE, channel, --i));
}
return convert(result);
}
private String getSessionId(Request request) {
return request.getSession().getId();
}
private Sequence<SafeString> getChannels(Request request) {
return getSessionState(request.getSession()).getSubscriptions();
}
}
- PatternUnsubscribeCommand实现了DBCommand, PatternSubscriptionSupport接口,其execute遍历channel挨个执行removePatternSubscription(admin, sessionId, channel)及getSessionState(request.getSession()).removeSubscription(channel)
小结
claudb pubsub相关的command有PublishCommand、SubscribeCommand、UnsubscribeCommand、PatternSubscribeCommand、PatternUnsubscribeCommand
doc
- 在数据库上实现类似铁路售票锁票功能
- Android代码判断手机是否已root方法学习
- 实体类的枚举属性--原来支持枚举类型这么简单,没有EF5.0也可以
- Android中Context用法详解学习
- 【自然框架】之 “表单控件”与“实体类”
- Android数据存储实现的5大方式
- Android实现图片异步加载操作
- (PDF.NET框架实例讲解)将存储过程映射为实体类
- 【开源】QuickPager ASP.NET2.0分页控件——使用示例、基本应用和查询功能
- 移花接木:当泛型方法遇上抽象类----我的“内存数据库”诞生记
- Android扫描多媒体文件剖析
- Android的进程与线程使用总结
- Android在WebView中加载HTML并实现交互
- 使用ASP.NET MVC2+PDF.NET 构建一个简单的新闻管理程序 示例过程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring JPA 定义查询方法
- 代理工厂的简单应用
- iOS逆向之文件系统
- Kettle构建Hadoop ETL实践(四):建立ETL示例模型
- Java并发总篇
- 逻辑漏洞之密码找回漏洞(semcms)
- 逻辑漏洞之越权、支付漏洞
- 多线程基础(二): Thread源码分析
- JeecgBoot环境搭建及前后端项目启动
- Windows下MySQL 8.x和8.x以前版本的安装步骤
- Confluence 6 移动应用 app 管理员需要考虑什么
- leetcode链表之反转链表
- Prometheus监控神器-Kubernetes篇(一)
- Elastic:Elasticsearch 的分片管理策略
- 【Vulnhub】SkyDogCTF