Redis必知必會——發佈訂閱

銀行卡消費的時候,銀行每每會經過微信、短信或郵件通知用戶交易的詳細信息,這即是發佈訂閱模式。 咱們能夠使用下面的命令進行模擬redis

先打開一個客戶端1,輸入命令spring

SUBSCRIBE chat

表示客戶端1訂閱一個名爲chat的渠道,以後打開客戶端2,輸入命令微信

publish chat "Hello World!"

在Spring中,咱們自定義接收消息的類,須要實現MessageListener接口,並實現接口定義的方法onMessage,代碼以下。app

public class RedisMessageListener implements MessageListener {

    @SuppressWarnings("rawtypes")
    private RedisTemplate rt;

    @SuppressWarnings("rawtypes")
    public RedisTemplate getRt() {
        return rt;
    }

    @SuppressWarnings("rawtypes")
    public void setRt(RedisTemplate rt) {
        this.rt = rt;
    }


    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 獲取消息
        byte[] body = message.getBody();
        // 使用值序列化器轉換
        String msgBody = (String)getRt().getValueSerializer().deserialize(body);
        System.out.println(msgBody);
        // 獲取channel
        byte[] channel = message.getChannel();
        // 使用字符串序列化器轉換
        String channelStr = (String)getRt().getStringSerializer().deserialize(channel);
        System.out.println(channelStr);
        // 渠道名稱轉換
        String bytesStr = new String(pattern);
        System.out.println(bytesStr);
    }

}

這裏咱們沒有使用註解,因此要去spring.xml中註冊beanide

<!-- 實例化類 -->
<bean id="redisMsgListener" class="com.codeliu.transaction.RedisMessageListener">
    <property name="rt" ref="redisTemplate"></property>
</bean>

實例化監聽類以後還不行,還得給一個監聽容器,在Spring中對應的類爲RedisMessageListenerContainer,它能夠用來監聽Redis的發佈訂閱消息。一樣在Spring.xml中進行配置測試

<!-- 配置監聽容器 -->
<bean id="topicContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer" destroy-method="destroy">
    <!-- redis鏈接工廠 -->
    <property name="connectionFactory" ref="connectionFactory"></property>      
    <!-- 鏈接池,只有線程池生存,才能繼續監聽 -->
    <property name="taskExecutor">
        <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler">
            <property name="poolSize" value="3"></property>
        </bean>
    </property>     
    <!-- 消息監聽map -->
    <property name="messageListeners">
        <map>
            <!-- 配置監聽者,key-ref與bean id保持一致 -->
            <entry key-ref="redisMsgListener">
                <!-- 監聽類 -->
                <bean class="org.springframework.data.redis.listener.ChannelTopic">
                    <constructor-arg value="chat"></constructor-arg>
                </bean>
            </entry>
        </map>
    </property>
</bean>

這裏配置了線程池,這個線程池將會持續的生存以等待消息傳入,而這裏配置了容器用id爲redisMsgListener的Bean進行渠道chat的監聽。當消息經過渠道chat方法的時候,就會使用id爲redisMsgListener的Bean處理消息。this

下面進行測試線程

public static void main(String[] args) {
    ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
    RedisTemplate rt = applicationContext.getBean(RedisTemplate.class);
    String channel = "chat";
    // 向渠道chat發送消息
    rt.convertAndSend(channel, "Hello World!");
}

convertAndSend方法就是向指定的渠道發送消息。code

輸出xml

Hello World!
chat
chat
相關文章
相關標籤/搜索