Spring-data-redis配置 订阅/发布 功能
jopen
9年前
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我发布的消息!"); } }