Redis 不僅提供一個(gè)NoSQL數(shù)據(jù)庫(kù)川陆,同時(shí)還提供了一套消息系統(tǒng)。
下面我將Spring Boot使用Redis進(jìn)行消息的發(fā)布與訂閱具體的流程分享給大家
首先引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
1.發(fā)送消息
@SpringBootApplication
@EntityScan(basePackages= {"cn.sh.sttri.app.messagepush"})
@EnableCaching
@EnableScheduling
public class MessagepushApplication {
public static void main(String[] args) {
ApplicationContext ct=SpringApplication.run(MessagepushApplication.class, args);
StringRedisTemplate template = ct.getBean(StringRedisTemplate.class);
template.convertAndSend("messagepush", "Hello message !");
template.convertAndSend("messagepush3", "Hello message3 !");
}
}
發(fā)送消息我們使用StringRedisTemplate來發(fā)送鍵和值均為字符串的消息矛市。在main()方法中我們創(chuàng)建一個(gè)Spring應(yīng)用的Context辨赐,初始化消息監(jiān)聽者容器优俘,開始監(jiān)聽消息。然后獲取StringRedisTemplate的實(shí)例掀序,往messagepush和messagepush3兩個(gè)主題發(fā)送消息
2.Redis 配置消息通道
創(chuàng)建一個(gè)Redis消息配置類
連接工程我們使用Spring Boot默認(rèn)的RedisConnectionFactory
我們將在listenerAdapter方法中定義的Bean注冊(cè)為一個(gè)消息監(jiān)聽者帆焕,它將監(jiān)聽messagepush和messagepush3兩個(gè)主題的消息。
因?yàn)镽eceiver類是一個(gè)POJO不恭,要將它包裝在一個(gè)消息監(jiān)聽者適配器(實(shí)現(xiàn)了MessageListener接口)叶雹,這樣才能被監(jiān)聽者容器RedisMessageListenerContainer的addMessageListener方法添加到連接工廠中。有了這個(gè)適配器换吧,當(dāng)一個(gè)消息到達(dá)時(shí)折晦,就會(huì)調(diào)用receiveMesage()方法進(jìn)行響應(yīng)。
@Configuration
public class RedisChannelConfig {
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//訂閱主題messagepush和messagepush3
container.addMessageListener(listenerAdapter, new PatternTopic("messagepush"));
container.addMessageListener(listenerAdapter, new PatternTopic("messagepush3"));
//這個(gè)container 可以添加多個(gè) messageListener
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(MessageReceive receiver) {
//這個(gè)地方 是給messageListenerAdapter 傳入一個(gè)消息接受的處理器沾瓦,利用反射的方法調(diào)用“receiveMessage”
//也有好幾個(gè)重載方法满着,這邊默認(rèn)調(diào)用處理器的方法 叫handleMessage 可以自己到源碼里面看
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean //注入操作數(shù)據(jù)的template(這里不需要操作redis數(shù)據(jù),和消息隊(duì)列功能無關(guān))
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
3.處理MessageReceive 消息接收類的receiveMessage()處理業(yè)務(wù)
/**redis 消息處理器*/
@Component
public class MessageReceive {
@Autowired
private MessageReceiveHandler messageReceiveHandler;
/**接收消息的方法*/
public void receiveMessage(String message){
//System.out.println(message);
messageReceiveHandler.messagePush(message);
}
}
到MessageReceiveHandler 類中調(diào)用messagePush()
@Component
public class MessageReceiveHandler {
public void messagePush(String message){
System.out.println("----------收到消息了message:"+message);
}
}
到這里一個(gè)完整的Spring Boot使用Redis進(jìn)行消息的發(fā)布與訂閱過程就打通了