Redis实现消息发布订阅

对于一些解耦异步行为,往往会使用到MQ消息队列,但是很多时候可能由于条件受限没有可使用的消息队列供我们使用,那么则可以使用Redis来实现简单的消息发布订阅。

很简单,只需要三个类即可实现。

/**
 * MQ频道主题配置
 */
@Configuration
public class RedisConfig {

    @Bean
    MessageListenerAdapter messageListenerAdapter(RedisMessageSubscriber subscriber) {
        return new MessageListenerAdapter(subscriber);
    }

    @Bean
    RedisMessageListenerContainer redisContainer(RedisConnectionFactory connectionFactory,
                                                 MessageListenerAdapter listenerAdapter) {
        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        // 要监听的频道主题
        container.addMessageListener(listenerAdapter, new ChannelTopic(GlobalConst.HELLO_CHANNEL));
        return container;
    }
}
/**
 * 发布者
 */
@Component
public class RedisMessagePublisher {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    public void publish(String channel, String message) {
        redisTemplate.convertAndSend(channel, message);
    }
}
/**
 * 订阅者
 */
@Component
public class RedisMessageSubscriber implements MessageListener {

    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 接收到消息后的处理逻辑
        String channel = new String(message.getChannel());
        String msg = new String(message.getBody());
        if (GlobalConst.HELLO_CHANNEL.equals(channel)) {
            System.out.println("Received message from channel: " + channel + "\nmessage: " + msg);
        }
    }
}

写一个接口,通过接口调用来触发消息的发布与订阅

 

显然,与传统RabbitMq不同的是,Redis所实现的消息队列订阅者是集成一体的。

也就是说无论有多少个channel topic,都是一个订阅者在消费发布者所通知的消息,因此需要在订阅者中根据不同的channel topic做出不同的行为(记得在配置类中添加你需要订阅的channel topic)

posted @ 2024-11-03 03:45  Ashe|||^_^  阅读(4)  评论(0编辑  收藏  举报