Spring-data-redis配置 订阅/发布 功能

原创
2015/05/14 10:16
阅读数 596

Spring-data-redis配置 订阅/发布 功能


一、添加maven依赖

<!-- redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>1.5.0.RELEASE</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.6.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.13</version>
<scope>provided</scope>
</dependency>
<!-- redis -->

二、redis.properties

##applicationContext-redis.xml
redis.ip=192.168.1.156
redis.port=6379 
redis.timeout=5000
redis.maxIdle=10
redis.minIdle=1
redis.maxTotal=30 
redis.maxWaitMillis=5000  
#testOnBorrow true 指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true

三、applicationContext-redis-pub-sub-demo.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:rabbit="http://www.springframework.org/schema/rabbit"
	xmlns:util="http://www.springframework.org/schema/util" xmlns:redis="http://www.springframework.org/schema/redis"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
						http://www.springframework.org/schema/jee
						http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
						http://www.springframework.org/schema/aop
						http://www.springframework.org/schema/aop/spring-aop-4.0.xsd
						http://www.springframework.org/schema/context
						http://www.springframework.org/schema/context/spring-context-4.0.xsd
						http://www.springframework.org/schema/util
                        http://www.springframework.org/schema/util/spring-util-4.0.xsd
                        http://www.springframework.org/schema/redis
        http://www.springframework.org/schema/redis/spring-redis-1.0.xsd"
	default-lazy-init="true">
<description>redis 发布 定阅 示例</description>
<context:property-placeholder location="classpath*:redis.properties" />
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="minIdle" value="${redis.minIdle}" />
<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
</bean>
<bean id="jedisConnectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.ip}" />
<property name="port" value="${redis.port}" />
<property name="timeout" value="${redis.timeout}" />
<property name="poolConfig" ref="jedisPoolConfig" />
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="jedisConnectionFactory" />
</bean>
 
 
 <bean id="listener" class="cn.com.easy.redis.RedisMessageListenerService" />

	<redis:listener-container connection-factory="jedisConnectionFactory">
		<!-- the method attribute can be skipped as the default method name is 
			"handleMessage" -->
			<!-- topic代表监听的通道,是一个正规匹配 -->
		<redis:listener ref="listener" method="handleMessage"
			topic="*" />
	</redis:listener-container>
 
 
</beans>


四、接收端  RedisMessageListenerService.java

package cn.com.easy.redis;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
 * 订阅服务类
 * 
 * @author nibili 2015年5月14日
 * 
 */
public class RedisMessageListenerService {
@SuppressWarnings("resource")
public static void main(String[] args) {
new ClassPathXmlApplicationContext("/applicationContext-redis-pub-sub-demo.xml");
while (true) { // 这里是一个死循环,目的就是让进程不退出,用于接收发布的消息
try {
System.out.println("current time: " + new Date());
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void handleMessage(Serializable message) {
// 什么都不做,只输出
if (message == null) {
System.out.println("null");
} else if (message.getClass().isArray()) {
System.out.println(Arrays.toString((Object[]) message));
} else if (message instanceof List<?>) {
System.out.println(message);
} else if (message instanceof Map<?, ?>) {
System.out.println(message);
} else {
System.out.println(ToStringBuilder.reflectionToString(message));
}
}
}

五、发送端

package cn.com.easy.redis;
import javax.annotation.Resource;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
 * 发布消息测试
 * 
 * @author nibili 2015年5月14日
 * 
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("/applicationContext-redis-demo.xml")
public class RedisPubTest {
@Resource(name = "redisTemplate")
private RedisTemplate<String, String> template;
/**
 * 发布消息
 * 
 * @auth nibili 2015年5月14日
 */
@Test
public void pub() {
template.convertAndSend("java", "java我发布的消息!");
}
}


展开阅读全文
打赏
0
18 收藏
分享
加载中
nibilly博主

引用来自“空指针1993”的评论

我的为什么不执行?
参考我的开源项目,里面有完整可运行的demo http://git.oschina.net/nibilly/easy-commons
2015/10/24 17:08
回复
举报
我的为什么不执行?
2015/10/24 16:23
回复
举报
更多评论
打赏
2 评论
18 收藏
0
分享
返回顶部
顶部