所以我们在做发布订阅的响应消息解析时, 可以返回 List. 这里以 SUBSCRIBE/PSUBSCRIBE 举例 private boolean handleSubscribe(byte[] resp,List<Object> reply){
- // 是否普通订阅
- boolean isSubscribe = Arrays.equals(SUBSCRIBE.raw, resp);
- // 是否模式匹配订阅
- boolean isPSubscribe = Arrays.equals(Keyword.PSUBSCRIBE.raw, resp);
- if (isSubscribe || isPSubscribe) {
- resetSubscribedChannels(reply);
- // 第二个值为 channel 名称
- final byte[] channelBytes = (byte[]) reply.get(1);
- // 转化为 string
- final String channel = getString(channelBytes);
- // 调用事件 (onSubscribe,onPSubscribe 子类可以重写)
- if (isSubscribe) {
- onSubscribe(channel);
- } else {
- onPSubscribe(channel);
- }
- return true;
- }
- return false;
- } public abstract void onSubscribe(final String channel);
public abstract void onPSubscribe(final String channelPatterns); 在 MyPubSub 中重写上述两个方法. @Override
- public void onSubscribe(String channel) {
- System.out.println("订阅了:"+channel);
- }
- @Override
- public void onPSubscribe(String channelPatterns) {
- System.out.println("订阅了:"+channelPatterns);
} 这样, 我们就能够收到回调消息了. 订阅了: news.* 接收到消息同理: @Override
- public void onMessage(String channel, String message) {
- System.out.println(channel + "收到了消息:"+message);
} channel1 收到了消息: welcome to NBA. 不过这里需要注意的一点是, 在普通订阅的消息中只有 [MESSAGE,CHANNEL,CONTENT] 三个值, 而模式匹配的订阅消息中, 有 [PMESSAGE,PATTERN,CHANNEL,CONTENT] 四个值, 其中就多了一个 PATTERN, 也就是上文中的 news.*, 所以稍微做一下区分就可以了 private boolean handleMessage(byte[] resp, List<Object> reply) {
- boolean isMessage = Arrays.equals(MESSAGE.raw, resp);
- boolean isPMessage = Arrays.equals(PMESSAGE.raw, resp);
- if (isMessage || isPMessage) {
- final byte[] secondBytes = (byte[]) reply.get(1);
- final byte[] thirdBytes = (byte[]) reply.get(2);
- final String second = getString(secondBytes);
- final String third = getString(thirdBytes);
- if (isMessage) {
- onMessage(second, third);
- } else {
- final byte[] messageBytes = (byte[]) reply.get(3);
- final String message = getString(messageBytes);
- onPMessage(second, third, message);
- }
- return true;
} 调用示例 news.country(news.*) 收到了消息: this is china news 总结 本文简单的对 Redis 的 Pub/Sub 模式做了介绍, 并且在客户端中做了相应的处理. 当然其中也是大量参考了 Jedis 源码. 本文就到这里啦, 88
- googletag.cmd = googletag.cmd || []; googletag.cmd.push(function() {
- googletag.defineSlot('/1090369/C1', [300, 250], 'div-gpt-ad-1546353474406-0').addService(googletag.pubads());
- googletag.defineSlot('/1090369/C2', [468, 60], 'div-gpt-ad-1539008685004-0').addService(googletag.pubads());
- googletag.pubads().enableSingleRequest();
- googletag.enableServices();
- }); if(canShowAdsense()) {
- googletag.cmd.push(function() {
- googletag.display('div-gpt-ad-1546353474406-0');
- });
- } if(canShowAdsense()) {
- googletag.cmd.push(function() {
- googletag.display('div-gpt-ad-1539008685004-0');
- });
- } fixPostBody();
- setTimeout(function () {
- incrementViewCount(cb_entryId);
- }, 50);
- deliverAdT2();
- deliverAdC1();
- deliverAdC2();
- loadNewsAndKb();
- loadBlogSignature();
- LoadPostInfoBlock(cb_blogId, cb_entryId, cb_blogApp, cb_blogUserGuid);
- GetPrevNextPost(cb_entryId, cb_blogId, cb_entryCreatedDate, cb_postType);
- loadOptUnderPost();
- loadBlogNews();
- loadBlogDefaultCalendar();
来源: https://www.cnblogs.com/panzi/p/10232452.html