|  |  |  | 
|---|
|  |  |  | package com.genersoft.iot.vmp.conf; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.genersoft.iot.vmp.common.VideoManagerConstants; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.impl.RedisAlarmMsgListener; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.service.impl.RedisGPSMsgListener; | 
|---|
|  |  |  | import org.apache.commons.lang3.StringUtils; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Value; | 
|---|
|  |  |  | import org.springframework.cache.annotation.CachingConfigurerSupport; | 
|---|
|  |  |  | import org.springframework.context.annotation.Bean; | 
|---|
|  |  |  | import org.springframework.context.annotation.Configuration; | 
|---|
|  |  |  | import org.springframework.data.redis.connection.RedisConnectionFactory; | 
|---|
|  |  |  | import org.springframework.data.redis.core.RedisTemplate; | 
|---|
|  |  |  | import org.springframework.data.redis.listener.PatternTopic; | 
|---|
|  |  |  | import org.springframework.data.redis.listener.RedisMessageListenerContainer; | 
|---|
|  |  |  | import org.springframework.data.redis.serializer.StringRedisSerializer; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import com.alibaba.fastjson.parser.ParserConfig; | 
|---|
|  |  |  | import com.genersoft.iot.vmp.utils.redis.FastJsonRedisSerializer; | 
|---|
|  |  |  | import redis.clients.jedis.JedisPool; | 
|---|
|  |  |  | import redis.clients.jedis.JedisPoolConfig; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * @Description:Redis中间件配置类 | 
|---|
|  |  |  | * @author: songww | 
|---|
|  |  |  | * @description:Redis中间件配置类,使用spring-data-redis集成,自动从application.yml中加载redis配置 | 
|---|
|  |  |  | * @author: swwheihei | 
|---|
|  |  |  | * @date: 2019年5月30日 上午10:58:25 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Configuration | 
|---|
|  |  |  | // @EnableCaching | 
|---|
|  |  |  | public class RedisConfig extends CachingConfigurerSupport { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Value("${spring.redis.host}") | 
|---|
|  |  |  | private String host; | 
|---|
|  |  |  | @Value("${spring.redis.port}") | 
|---|
|  |  |  | private int port; | 
|---|
|  |  |  | @Value("${spring.redis.database}") | 
|---|
|  |  |  | private int database; | 
|---|
|  |  |  | @Value("${spring.redis.password}") | 
|---|
|  |  |  | private String password; | 
|---|
|  |  |  | @Value("${spring.redis.timeout}") | 
|---|
|  |  |  | private int timeout; | 
|---|
|  |  |  | @Value("${spring.redis.poolMaxTotal:1000}") | 
|---|
|  |  |  | private int poolMaxTotal; | 
|---|
|  |  |  | @Value("${spring.redis.poolMaxIdle:500}") | 
|---|
|  |  |  | private int poolMaxIdle; | 
|---|
|  |  |  | @Value("${spring.redis.poolMaxWait:5}") | 
|---|
|  |  |  | private int poolMaxWait; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RedisGPSMsgListener redisGPSMsgListener; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Autowired | 
|---|
|  |  |  | private RedisAlarmMsgListener redisAlarmMsgListener; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Bean | 
|---|
|  |  |  | public JedisPool jedisPool() { | 
|---|
|  |  |  | if (StringUtils.isBlank(password)) { | 
|---|
|  |  |  | password = null; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | JedisPoolConfig poolConfig = new JedisPoolConfig(); | 
|---|
|  |  |  | poolConfig.setMaxIdle(poolMaxIdle); | 
|---|
|  |  |  | poolConfig.setMaxTotal(poolMaxTotal); | 
|---|
|  |  |  | // 秒转毫秒 | 
|---|
|  |  |  | poolConfig.setMaxWaitMillis(poolMaxWait * 1000L); | 
|---|
|  |  |  | JedisPool jp = new JedisPool(poolConfig, host, port, timeout * 1000, password, database); | 
|---|
|  |  |  | return jp; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Bean("redisTemplate") | 
|---|
|  |  |  | public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { | 
|---|
|  |  |  | RedisTemplate<Object, Object> template = new RedisTemplate<>(); | 
|---|
|  |  |  | template.setConnectionFactory(redisConnectionFactory); | 
|---|
|  |  |  | ParserConfig.getGlobalInstance().setAutoTypeSupport(true); | 
|---|
|  |  |  | // 使用fastjson进行序列化处理,提高解析效率 | 
|---|
|  |  |  | FastJsonRedisSerializer<Object> serializer = new FastJsonRedisSerializer<Object>(Object.class); | 
|---|
|  |  |  | // value值的序列化采用fastJsonRedisSerializer | 
|---|
|  |  |  | template.setValueSerializer(serializer); | 
|---|
|  |  |  | 
|---|
|  |  |  | // key的序列化采用StringRedisSerializer | 
|---|
|  |  |  | template.setKeySerializer(new StringRedisSerializer()); | 
|---|
|  |  |  | template.setHashKeySerializer(new StringRedisSerializer()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | template.setConnectionFactory(redisConnectionFactory); | 
|---|
|  |  |  | // 使用fastjson时需设置此项,否则会报异常not support type | 
|---|
|  |  |  | ParserConfig.getGlobalInstance().setAutoTypeSupport(true); | 
|---|
|  |  |  | return template; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | * 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param connectionFactory | 
|---|
|  |  |  | * @param listenerAdapter | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @Bean | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | RedisMessageListenerContainer container = new RedisMessageListenerContainer(); | 
|---|
|  |  |  | container.setConnectionFactory(connectionFactory); | 
|---|
|  |  |  | container.addMessageListener(redisGPSMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_GPS)); | 
|---|
|  |  |  | container.addMessageListener(redisAlarmMsgListener, new PatternTopic(VideoManagerConstants.VM_MSG_SUBSCRIBE_ALARM_RECEIVE)); | 
|---|
|  |  |  | return container; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | //   @Bean | 
|---|
|  |  |  | //   RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, | 
|---|
|  |  |  | //         MessageListenerAdapter listenerAdapter) { | 
|---|
|  |  |  | // | 
|---|
|  |  |  | //      RedisMessageListenerContainer container = new RedisMessageListenerContainer(); | 
|---|
|  |  |  | //      container.setConnectionFactory(connectionFactory); | 
|---|
|  |  |  | //      // 订阅了一个叫通道 | 
|---|
|  |  |  | //      container.addMessageListener(listenerAdapter, new PatternTopic(VideoManagerConstants.KEEPLIVEKEY_PREFIX+"*")); | 
|---|
|  |  |  | //      // 这个container 可以添加多个 messageListener | 
|---|
|  |  |  | //      return container; | 
|---|
|  |  |  | //   } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //   /** | 
|---|
|  |  |  | //     * 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法 | 
|---|
|  |  |  | //     * @param receiver | 
|---|
|  |  |  | //     * @return | 
|---|
|  |  |  | //     */ | 
|---|
|  |  |  | //    @Bean | 
|---|
|  |  |  | //    MessageListenerAdapter listenerAdapter(MessageReceiver receiver) { | 
|---|
|  |  |  | //        //这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage” | 
|---|
|  |  |  | //        //也有好几个重载方法,这边默认调用处理器的方法 叫handleMessage 可以自己到源码里面看 | 
|---|
|  |  |  | //        return new MessageListenerAdapter(receiver, "receiveMessage"); | 
|---|
|  |  |  | //    } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|