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消息订阅发布测试!");
    }

  

posted @ 2020-03-15 12:34  陈小兵  阅读(728)  评论(0编辑  收藏  举报