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方法发布一条消息。