zoukankan      html  css  js  c++  java
  • Redis实现简单的消息队列

    1         准备工作

    先确保代码中已经集成Redis

    2         Redis消息监听器配置

    //序列化定制
    @Bean
    public Jackson2JsonRedisSerializer<Object> jackson2JsonSerializer() {
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(
                Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);
        return jackson2JsonRedisSerializer;
    }
    /**
     * redis消息监听器
     */
    @Bean
    public MessageListenerAdapter lister(Jackson2JsonRedisSerializer jackson2JsonRedisSerializer, RedisMessageSubscriber subscriber){
        MessageListenerAdapter adapter=new MessageListenerAdapter(subscriber,"onMessage");
        adapter.setSerializer(jackson2JsonRedisSerializer);
        adapter.afterPropertiesSet();
        return adapter;
    }
    
    /**
     * 将订阅器绑定到容器
     * @param connectionFactory
     * @param listener
     * @return
     */
    @Bean
    public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listener) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.addMessageListener(listener, new PatternTopic("/redis/*"));
        container.setTaskExecutor(Executors.newFixedThreadPool(20));//避免创建线程过多
        return container;
    }
    

      

    3   Redis消息发布推送

    /**
     * @author xbchen
     * @date 2020-3-2 13:58:33
     * @description Reis消息发布推送
     */
    @Service
    public class RedisMessagePublish {
        private final Logger logger = LoggerFactory.getLogger(RedisMessagePublish.class);
    
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
    
        private ChannelTopic topic = new ChannelTopic("/redis/pubsub");
    
        /**
         * 推送消息
         *
         * @param publisher
         * @param content
         */
        public void publish(String publisher, String content) {
            logger.info("{}发布Redis消息=====>{}", publisher, content);
            redisTemplate.convertAndSend(topic.getTopic(), content);
        }
    }
    

      

    4 Redis消息接收

    /**
     * @author xbchen
     * @date 2020-3-2 13:58:33
     * @description 模拟消息接收类
     */
    @Component
    public class RedisMessageSubscriber {
        private final Logger logger = LoggerFactory.getLogger(RedisMessageSubscriber.class);
    
        public void onMessage(String message, String pattern) {
            logger.info("接收到Redis消息=====>:topic {} ;message {} ", pattern, message);
        }
    }
    

    5  测试

    @Scheduled(cron = "0/10 * * * * ? ")
        public void testResitMessageTask() {
            publishService.publish("admin", "redis消息订阅发布测试!");
        }
    

      

  • 相关阅读:
    Lock、synchronized和ReadWriteLock,StampedLock戳锁的区别和联系以及Condition
    Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十一):集成 Shiro 框架
    Spring Cloud之路:(七)SpringBoot+Shiro实现登录认证和权限管理
    XSS过滤JAVA过滤器filter 防止常见SQL注入
    shiro jwt 构建无状态分布式鉴权体系
    JSON Web Token 入门教程
    C#实现WinForm DataGridView控件支持叠加数据绑定
    C#实现WinForm窗体逐渐显示效果
    定义通用的可通过lambda表达式树来获取属性信息
    C#实现通用数据过滤窗体
  • 原文地址:https://www.cnblogs.com/brant/p/12496916.html
Copyright © 2011-2022 走看看