您的位置:首页 > 数据库 > Redis

Spring结合Redis实现消息发布与订阅

2017-08-08 16:36 736 查看
1.需要的jar依赖

<dependency>

  <groupId>redis.clients</groupId>

  <artifactId>jedis</artifactId>

  <version>2.5.2</version>

</dependency>

<dependency>

  <groupId>org.springframework.data</groupId>

  <artifactId>spring-data-redis</artifactId>

  <version>1.6.4.RELEASE</version>

</dependency>

2.applicationContext.xml

<!-- redis服务配置 开始-->
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="${redis.maxTotal}" />
<property name="minIdle" value="${redis.minIdle}" />
<property name="maxWaitMillis" value="${redis.maxWaitTime}" />
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="testOnBorrow" value="${redis.testOnBorrow}" />
<property name="testOnReturn" value="true" />
<property name="testWhileIdle" value="true" />
</bean>

<bean id="sentinelConfiguration"
class="org.springframework.data.redis.connection.RedisSentinelConfiguration">
<property name="master">
<bean class="org.springframework.data.redis.connection.RedisNode">
<property name="name" value="${redis.sentinel.masterName}"></property>
</bean>
</property>
<property name="sentinels">
<set>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host"
value="${redis.sentinel1.host}"></constructor-arg>
<constructor-arg name="port"
value="${redis.sentinel1.port}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host"
value="${redis.sentinel2.host}"></constructor-arg>
<constructor-arg name="port"
value="${redis.sentinel2.port}"></constructor-arg>
</bean>
<bean class="org.springframework.data.redis.connection.RedisNode">
<constructor-arg name="host"
value="${redis.sentinel3.host}"></constructor-arg>
<constructor-arg name="port"
value="${redis.sentinel3.port}"></constructor-arg>
</bean>
</set>
</property>
</bean>

<bean id="connectionFactory"
class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:password="${redis.sentinel.password}">
<constructor-arg name="sentinelConfig" ref="sentinelConfiguration"></constructor-arg>
<constructor-arg name="poolConfig" ref="poolConfig"></constructor-arg>
<property name="database" value="${redis.database}"/>
</bean>

<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="connectionFactory" />
</bean>

<bean id="redisService" class="com.hthl.xxtd.service.redis.RedisService">
<property name="redisTemplate" ref="redisTemplate"></property>
</bean>

<!-- 对象序列化方式 -->
<bean id="jdkSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer" />

<!-- 配置监听器,redis在订阅消息时,会根据 redis:listener标签指定的方法名和通道(topic)调用不同的方法-->
<bean id="redisMsgListener" class="com.hthl.xxtd.web.listen.RedisMessageListenerContainer" />

<redis:listener-container connection-factory="connectionFactory">
<!-- topic代表监听的通道,是一个正则匹配 -->
<redis:listener ref="redisMsgListener" serializer="jdkSerializer" method="sendEmail" topic="hthl_email" />
</redis:listener-container>
<!-- redis服务配置 结束 -->3.消息发布者
package com.hthl.xxtd.service.redis;

import java.io.Serializable;

import org.springframework.data.redis.core.RedisTemplate;

import com.hthl.xxtd.model.email.EmailRecord;

/**
*
* @see
* @author xuxile
* @date 2014-9-28 下午2:26:30
* @version
* @desc 消息发布者
*/
public class RedisService {

private RedisTemplate<Serializable, Serializable> redisTemplate;

/**
* 发布者:发送邮件
* */
public void sendEmail(EmailRecord emailRecord){
redisTemplate.convertAndSend("hthl_email",emailRecord);
}
}4.消息订阅者
package com.hthl.xxtd.web.listen;

import javax.annotation.Resource;

import org.apache.log4j.Logger;

import com.hthl.xxtd.model.email.EmailRecord;
import com.hthl.xxtd.service.email.EmailChannelService;

import net.sf.json.JSONObject;
/**
* 订阅者
* */
public class RedisMessageListenerContainer{
private static final Logger logger = Logger.getLogger(RedisMessageListenerContainer.class);
@Resource
private EmailChannelService emailChannelService;

//发送邮件
public void sendEmail(EmailRecord emailRecord, String channel) {
logger.info("订阅者"+channel+"收到邮件:"+ JSONObject.fromObject(emailRecord).toString());
}

}5.总结
Redis消息的发布和订阅实例中我没有把EmailRecord类贴出来,是因为你可以把这个类替换成任何你想要的类,只要这个类实现了序列化接口就可以。另外spring配置文件中的很多变量如:${redis.sentinel.masterName}都在我的配置文件中,我也没有贴出来,因为你可以把这个对应的换成自己的redis服务地址,端口等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: