java实现redis发布订阅实例

Redis发布/订阅主要用到 subscribe、unsubscribe 和 publish 三个命令,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。下面将使用java来实现一个简单的发布订阅实例。

Redis发布/订阅主要用到 subscribe、unsubscribe 和 publish 三个命令,在这个实现中,发送者(发送信息的客户端)不是将信息直接发送给特定的接收者(接收信息的客户端),而是将信息发送给频道(channel),然后由频道将信息转发给所有对这个频道感兴趣的订阅者。下面将使用java来实现一个简单的发布订阅实例。

开发环境

  • eclipase

  • junit(单元测试)

  • log4j(日志框架)

  • jedis(Redis java jar包)

如下图:

java实现redis发布订阅实例

实现代码

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

不是每一次努力都有收获,但是,每一次收获都必须努力。
0 不喜欢
说说我的看法 -
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号