Redis實現訊息釋出訂閱

Ashe|||^_^發表於2024-11-03

對於一些解耦非同步行為,往往會使用到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);
        }
    }
}

Redis實現訊息釋出訂閱

寫一個介面,透過介面呼叫來觸發訊息的釋出與訂閱

Redis實現訊息釋出訂閱

顯然,與傳統RabbitMq不同的是,Redis所實現的訊息佇列訂閱者是整合一體的。

也就是說無論有多少個channel topic,都是一個訂閱者在消費釋出者所通知的訊息,因此需要在訂閱者中根據不同的channel topic做出不同的行為(記得在配置類中新增你需要訂閱的channel topic)

相關文章