Redis发布/订阅主要用到 subscribe、unsubscribe 和 publish 三个命令,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。下面将使用java来实现一个简单的发布订阅实例。
eclipase
junit(单元测试)
log4j(日志框架)
jedis(Redis java jar包)
如下图:
1、R.java文件,该文件维护Redis服务器信息。代码如下:
package com.huangx; /** * Redis服务器常量信息 * * @author Administrator * @date 2017年2月22日 15:08:57 */ public class R { private R() {} /** * Redis服务器IP */ public static final String SERVER_IP = "192.168.1.21"; /** * Redis服务器端口 */ public static final int SERVER_PORT = 6379; }
2、Base.java文件,JUnit测试基础类,用于在方法调用前后初始化/销毁Redis连接。代码如下:
package com.huangx; import org.apache.log4j.Logger; import org.junit.After; import org.junit.Before; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; /** * JUnit测试基础类 * * @author Administrator * @date 2017年2月22日 15:09:33 */ public class Base { protected Logger logger = Logger.getLogger(getClass()); protected JedisPool pool; protected Jedis jedis; @Before public void before() { try { logger.debug("开始初始化连接"); pool = new JedisPool(R.SERVER_IP, R.SERVER_PORT); jedis = pool.getResource(); logger.debug("连接建立完成"); } catch(Exception e) { logger.debug("初始化连接失败!", e); } } @After public void after() { if ( jedis != null ) { jedis.close(); } if ( pool != null ) { pool.destroy(); } jedis = null; pool = null; } }
3、PubSubHello.java文件,发布/订阅简单的应用。代码如下:
package com.huangx.simple; import org.junit.Test; import com.huangx.Base; import com.huangx.SimpleJedisPubSub; /** * Redis第一个简单的发布/订阅应用 * * @author Administrator * @date 2017年2月22日 15:20:11 */ public class PubSubHello extends Base { static final String CHANNEL_NAME = "channel_base"; /** * 订阅频道。(频道{@link CHANNEL_NAME}) */ @Test public void subscribe() { // 订阅并监听发布的消息 this.jedis.subscribe(new SimpleJedisPubSub(), CHANNEL_NAME); } /** * 发布消息 */ @Test public void publish() { this.jedis.publish(CHANNEL_NAME, "hi! 简单的发布/订阅实例"); logger.debug("发布消息成功"); } }
4、SimpleJedisPubSub.java文件,消息处理器。代码如下:
package com.huangx; import org.apache.log4j.Logger; import redis.clients.jedis.JedisPubSub; /** * JedisPubSub默认实现 * * @author Administrator * @date 2017年2月22日 15:37:59 */ public class SimpleJedisPubSub extends JedisPubSub { private Logger logger = Logger.getLogger(getClass()); /** * 退订时调用 */ @Override public void onUnsubscribe(String paramString, int paramInt) { logger.debug("onUnsubscribe [" + paramString + ", " + paramInt + "]"); } /** * 订阅时调用 */ @Override public void onSubscribe(String paramString, int paramInt) { logger.debug("onSubscribe [" + paramString + ", " + paramInt + "]"); } /** * 接收非模式匹配发布消息 */ @Override public void onMessage(String paramString1, String paramString2) { logger.debug("onMessage [" + paramString1 + ", " + paramString2 + "]"); } /** * 模式退订时调用 */ @Override public void onPUnsubscribe(String paramString, int paramInt) { logger.debug("onPUnsubscribe [" + paramString + ", " + paramInt + "]"); } /** * 模式订阅时调用 */ @Override public void onPSubscribe(String paramString, int paramInt) { logger.debug("onPSubscribe [" + paramString + ", " + paramInt + "]"); } /** * 接收模式匹配发布的消息 */ @Override public void onPMessage(String paramString1, String paramString2, String paramString3) { logger.debug("onPMessage [" + paramString1 + ", " + paramString2 + ", " + paramString3 + "]"); } }
log4j配置文件如下:
log4j.rootLogger=all, console # console appender log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
注意:
先运行subscribe方法,订阅一个频道,并且监听服务器发布消息。然后,运行publish方法发布一条消息。