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

jopen 10年前

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我发布的消息!");  }  }