`
hywa
  • 浏览: 1329 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于spring-redis发布订阅模式的实现

阅读更多
redis配置:

<?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:context="http://www.springframework.org/schema/context"
	xmlns:redis="http://www.springframework.org/schema/redis" xmlns:p="http://www.springframework.org/schema/p"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
	   http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/redis
        http://www.springframework.org/schema/redis/spring-redis-1.0.xsd"
	default-autowire="byName">

	<context:property-placeholder location="classpath:redis.properties" />

	<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
		<property name="maxIdle" value="${redis.maxIdle}" />
		<property name="maxTotal" value="${redis.maxTotal}" />
		<property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
		<property name="testOnBorrow" value="${redis.testOnBorrow}" />
	</bean>
	<bean id="jedisConnectionFactory"
		class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
		destroy-method="destroy">
		<property name="poolConfig" ref="jedisPoolConfig"></property>
		<property name="hostName" value="${redis.host}"></property>
		<property name="port" value="${redis.port}"></property>
		<property name="password" value="${redis.pass}"></property>
	</bean>

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

	<bean id="registerMessageListener" class="com.gc.biz.cache.listener.RegisterMessageListener">
		<property name="redisTemplate" ref="redisTemplate"></property>
	</bean>
	
	<bean id="priDocMessageListener" class="com.gc.biz.cache.listener.PriDocRegActMsgListener">
		<property name="redisTemplate" ref="redisTemplate"></property>
	</bean>
	
	
	<bean id="redisDAO" class="com.gc.biz.cache.impl.MessageDaoImpl">
		<property name="redisTemplate" ref="redisTemplate" />
	</bean>
	
	<bean id="topicContainer"
		class="org.springframework.data.redis.listener.RedisMessageListenerContainer"
		destroy-method="destroy">
		<property name="connectionFactory" ref="jedisConnectionFactory" />
		<property name="taskExecutor">
			<bean
				class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
				<property name="poolSize" value="3"></property>
			</bean>
		</property>
		<property name="messageListeners">
			<map>
				<entry key-ref="registerMessageListener">
					<bean class="org.springframework.data.redis.listener.ChannelTopic">
						<constructor-arg value="coupon|redenvelop|notify|points" />
					</bean>
				</entry>
				
				<entry key-ref="priDocMessageListener">
					<bean class="org.springframework.data.redis.listener.ChannelTopic">
						<constructor-arg value="YZM|BG" />
					</bean>
				</entry>
				
			</map>
		</property>
	</bean>


	<bean id="springContext" class="com.gc.biz.cache.util.SpringContextHolder" />
	<bean id="doctorDAO" class="com.gc.biz.cache.impl.DoctorDAOImpl" >
		<property name="redisTemplate" ref="redisTemplate" />
	</bean>
	<bean id="remindDAO" class="com.gc.biz.cache.impl.RemindDAOImpl" />
	<bean id="userDAO" class="com.gc.biz.cache.impl.UserDAOImpl" />
	<bean id="userDataDAO" class="com.gc.biz.cache.impl.UserDataDAOImpl" />

</beans>  


监听器的实现:
package com.gc.biz.cache.listener;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import org.apache.log4j.Logger;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.RedisTemplate;

import com.gc.apps.jsk.coupon.service.CouponService;
import com.gc.apps.jsk.coupon.service.impl.CouponServiceImpl;
import com.gc.apps.jsk.invitationcode.service.InvitationService;
import com.gc.apps.jsk.invitationcode.service.impl.InvitationServiceImpl;
import com.gc.apps.jsk.login.service.RegisterService;
import com.gc.apps.jsk.login.service.impl.RegisterServiceImpl;
import com.gc.apps.jsk.membership.service.MemberShipService;
import com.gc.apps.jsk.membership.service.impl.MemberShipServiceImpl;
import com.gc.biz.member.dbobj.MemberInfo;
import com.gc.common.util.StrUtil;
import com.gc.frame.core.db.DBTransaction;
import com.gc.frame.core.misc.StringUtil;
import com.google.gson.Gson;

public class RegisterMessageListener implements MessageListener {

    private RedisTemplate<Serializable, Serializable> redisTemplate;

    private static Logger logger = Logger.getLogger(RegisterMessageListener.class);

    public void setRedisTemplate(RedisTemplate<Serializable, Serializable> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public void onMessage(Message message, byte[] pattern) {
        byte[] body = message.getBody();// 请使用valueSerializer
        byte[] channel = message.getChannel();
        // 请参考配置文件,本例中key,value的序列化方式均为string。
        // 其中key必须为stringSerializer。和redisTemplate.convertAndSend对应
        String msgContent = (String) redisTemplate.getValueSerializer().deserialize(body);
        String topic = (String) redisTemplate.getStringSerializer().deserialize(channel);
        System.out.println(topic + ":" + msgContent);
        Map<String, String> map = new Gson().fromJson(msgContent, Map.class);
        String from = map.get("from");
        if ("wx".equals(from)) {
            doRegisterMsg_wx(topic, msgContent);
        } else if ("app".equals(from)) {
            doRegisterMsg(topic, msgContent);
        }

    }

   


消息发送接口的实现:
package com.gc.biz.cache.impl;

import java.io.Serializable;

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

import com.gc.biz.cache.dao.MessageDao;

public class MessageDaoImpl implements MessageDao{
    
    private RedisTemplate<String , Object> redisTemplate = null;
    
    public MessageDaoImpl() {

    }
    
    @Override
    public void sendMessage(String channel, Serializable message) {
        redisTemplate.convertAndSend(channel, message);
    }

    public RedisTemplate<String, Object> getRedisTemplate() {
        return redisTemplate;
    }

    public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }
    
    
}



测试调用的方法:
MessageDao dao = SpringContextHolder.getBean("redisDAO");
Map<String,String> map = new HashMap<String,String>();
map.put("1", "11111");
map.put("2", "22222");
dao.sendMessage("coupon", new Gson().toJson(map));
dao.sendMessage("redenvelop", new Gson().toJson(map));
dao.sendMessage("notify", new Gson().toJson(map));

map.put("UserBagID", "1");
map.put("CreateDate", "2016-06-01 16:51:35");
dao.sendMessage("iphone|xiaomi", new Gson().toJson(map));


注意:1、如果有多个项目同时使用此配置,只需要保留一个项目配置文件有关注项目;2、此配置没有考虑分布式部署的环境,如果要考虑从redis list和分布式锁的方向考虑。
分享到:
评论

相关推荐

    spring-data-redis-1.6.0.RELEASE.jar + jedis-2.7.2.jar

    它的特点包括高性能、丰富的数据结构支持(如字符串、哈希、列表、集合、有序集合)以及支持事务和发布/订阅模式。Redis通过网络进行通信,并且可以持久化数据,确保数据的安全性。 Jedis,全称为Java Redis Client...

    spring-data-redis-1.0.1

    5. **事件驱动与监听**:Spring Data Redis支持发布/订阅模式,允许应用监听Redis频道并做出响应。这对于构建实时系统或分布式事件系统非常有用。 6. **集成其他Spring组件**:Spring Data Redis可以与Spring Cache...

    spring-redis-mq, 基于 Spring 和 Redis 的分布式消息队列(MessageQueue)实现.zip

    此外,Redis还支持发布/订阅模式,可以用于广播消息或者实现多对多的消息传递。 在"spring-redis-mq"项目中,可能包含以下关键组成部分: 1. **配置**:项目可能包含Spring的配置文件,用于定义Redis连接池、消息...

    spring-data-redis-1.6.0.RELEASE最新稳定版(个人测试通过)

    5. **消息监听**:Spring Data Redis 还支持 Redis Pub/Sub(发布/订阅)模式,允许应用程序监听特定频道或模式的消息,实现事件驱动的架构。 6. **事务支持**:尽管 Redis 自身不支持传统的关系型数据库事务,但 ...

    spring-redis-mysql整合

    Redis支持发布/订阅模式,事务,以及多种数据结构,如字符串、列表、集合、哈希表等,适合用于缓存、消息队列、计数器等场景。 4. **Spring整合Mybatis**:Mybatis是一个优秀的持久层框架,它支持定制化SQL、存储...

    SpringMVC-Mybatis-Shiro-redis

    在实际开发过程中,开发者可以根据项目需求调整这四个组件的具体配置,例如优化Mybatis的SQL执行效率,调整Shiro的权限策略,或者利用Redis的高级特性如发布订阅模式来实现更复杂的功能。此外,通过持续集成和自动化...

    spring data redis 小例子

    Spring Data Redis是一个强大的Java库,它为开发人员提供了一种简单的方式来利用Redis内存数据存储进行...在实际项目中,你可以根据需求扩展这个例子,比如引入Redis的事务支持、发布订阅模式或者地理空间索引等功能。

    spring-data-redis英文版

    Spring Data Redis通过上述核心组件和服务,为开发者提供了一套完整的工具集,使得基于Spring的应用程序可以更加便捷地使用Redis,无论是单实例还是集群模式。此外,文档还介绍了支持社区和专业支持的方式,以及如何...

    spring data redis api jar

    9. **Redis Pub/Sub支持**:能够方便地订阅和发布消息,实现分布式消息通信。 10. **Spring整合**:Spring Data Redis与Spring框架深度集成,支持Spring Boot自动配置,可以快速搭建Redis相关的应用。 使用Spring ...

    spring data redis 官方文档

    - **启用集群**:Spring Data Redis 支持 Redis 集群模式,可以通过简单配置实现高可用和负载均衡。 - **操作 Redis Cluster Connection**:提供了专门的方法来操作集群连接,包括节点发现、数据分区等功能。 - **...

    毕业设计-基于Scrapy-redis的分布式爬虫Web平台

    毕业设计项目“基于Scrapy-redis的分布式爬虫Web平台”是将Scrapy爬虫框架与Redis数据库结合,实现一个高效、可扩展的分布式爬虫系统。该项目利用SSM(Spring、SpringMVC、MyBatis)框架构建前端Web界面,提供用户...

    13-基于Redis的消息队列之发布订阅模式1

    基于Redis的消息队列之发布订阅模式是指使用Redis作为消息队列的中间件,实现消息的发布和订阅。该模式下,消息的生产者将消息发布到Redis中,而消费者则可以从Redis中订阅和消费消息。该模式可以实现消息的异步处理...

    springboot_redis

    6. **消息队列支持**:Redis也可以作为消息中间件,Spring Boot提供了`RedisMessageListenerContainer`和`SimpleMessageConverter`等组件来实现发布/订阅模式。 7. **Sentinel或Cluster支持**:如果需要高可用性,...

    springBoot 2.1+springDataRedis2.x+spring 5.1集成本地包

    Spring Data Redis使得与Redis数据库交互变得简单,支持操作数据结构如哈希、列表、集合和有序集合,以及发布/订阅等高级特性。2.x版本可能包含了对Redis集群的支持,提高了可扩展性和容错性。 3. **Spring 5.1**:...

    redis-spring-pub_sub

    Redis是一个高性能的键值数据库,其中的一个特色功能就是发布/订阅模式。在这一模式下,数据不再局限于简单的键值操作,而是允许服务器向多个客户端广播消息。发布者(publisher)发送消息到一个频道(channel),...

    spring集成redis需要的jar包.rar

    5. Spring Data Redis的Repository:如果你希望使用更高级的Repository模式,可以创建自定义的Repository接口,继承`RedisRepository`或`CrudRepository`,Spring Data Redis会自动为你生成实现。 6. 集成...

    spring集成redis源代码

    `MessageListenerAdapter`和`SimpleMessageListenerContainer`用于实现Redis的发布/订阅功能。你可以定义监听器接口,Spring Data Redis会自动将接收到的消息转换为对应的方法调用。 8. **Redis配置** 在Spring ...

    SpringBoot + Redis实现事件的发布订阅功能

    本话题主要探讨如何利用SpringBoot和Redis实现事件的发布订阅功能,这对于实现分布式系统中的异步通信和解耦至关重要。 首先,我们需要理解SpringBoot的核心特性。SpringBoot是Spring框架的一个简化版本,它旨在...

    spring-boot mybaits spring security redis

    - **消息队列**:通过Redis的发布/订阅功能实现消息队列功能。 ### 综合运用案例 #### 1. 用户认证与授权 - **技术栈**:Spring Boot + Spring Security - **实现思路**: - 使用Spring Security配置安全拦截器...

    SpringBoot-redis

    同时,Redis还支持事务、发布/订阅模式等功能,进一步增强其在分布式系统中的应用价值。 总结来说,SpringBoot整合Redis提供了高效、便捷的方式来操作Redis的各种数据类型,从而在缓存、消息传递、数据存储等方面...

Global site tag (gtag.js) - Google Analytics