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服务地址,端口等。
<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服务地址,端口等。
相关文章推荐
- spring-redis实现消息生产者发布和消费者订阅
- 使用Spring-Redis实现消息的发布/订阅
- redis 消息队列发布订阅模式spring boot实现
- 【转】redis 消息队列发布订阅模式spring boot实现
- Spring Data Redis实现消息队列——发布/订阅模式
- Java实现Redis的消息订阅和发布
- spring---消息订阅发布之redis
- Spring Data Redis实现一个订阅/发布系统
- spring-redis实现订阅发布
- java+redis+spring mvc实现发布订阅(不同项目间)
- 使用redis的发布订阅模式实现消息队列
- php 实现redis发布订阅消息及时通讯
- springboot结合redis实现redis订阅发布模式
- Spring MVC + redis 消息的订阅发布
- Java实现Redis的消息订阅和发布
- springboot入门--springboot集成redis实现消息发布订阅模式
- 结合redis设计与实现的redis源码学习-17-发布与订阅(pubsub.c)
- linux下使用hiredis异步API实现sub/pub消息订阅和发布的功能 标签: hiredishiredis异步APIhiredis事件处理redis消息订阅发布redis c接口 2016-
- 【Redis】jedis客户端实现redis消息的发布订阅(实时消息中间件)
- Spring Data Redis实现一个订阅/发布系统