Redis 不只提供一個NoSQL數據庫,同時還提供了一套消息系統。 下面我將Spring Boot使用Redis進行消息的發佈與訂閱具體的流程分享給你們redis
首先引入依賴spring
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
複製代碼
@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 !");
}
}
複製代碼
發送消息咱們使用StringRedisTemplate來發送鍵和值均爲字符串的消息。在main()方法中咱們建立一個Spring應用的Context,初始化消息監聽者容器,開始監聽消息。而後獲取StringRedisTemplate的實例,往messagepush和messagepush3兩個主題發送消息數據庫
建立一個Redis消息配置類 鏈接工程咱們使用Spring Boot默認的RedisConnectionFactory 咱們將在listenerAdapter方法中定義的Bean註冊爲一個消息監聽者,它將監聽messagepush和messagepush3兩個主題的消息。bash
由於Receiver類是一個POJO,要將它包裝在一個消息監聽者適配器(實現了MessageListener接口),這樣才能被監聽者容器RedisMessageListenerContainer的addMessageListener方法添加到鏈接工廠中。有了這個適配器,當一個消息到達時,就會調用receiveMesage()方法進行響應。app
@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"));
//這個container 能夠添加多個 messageListener
return container;
}
@Bean
MessageListenerAdapter listenerAdapter(MessageReceive receiver) {
//這個地方 是給messageListenerAdapter 傳入一個消息接受的處理器,利用反射的方法調用「receiveMessage」
//也有好幾個重載方法,這邊默認調用處理器的方法 叫handleMessage 能夠本身到源碼裏面看
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean //注入操做數據的template(這裏不須要操做redis數據,和消息隊列功能無關)
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
複製代碼
/**redis 消息處理器*/
@Component
public class MessageReceive {
@Autowired
private MessageReceiveHandler messageReceiveHandler;
/**接收消息的方法*/
public void receiveMessage(String message){
//System.out.println(message);
messageReceiveHandler.messagePush(message);
}
}
複製代碼
到MessageReceiveHandler 類中調用messagePush()spring-boot
@Component
public class MessageReceiveHandler {
public void messagePush(String message){
System.out.println("----------收到消息了message:"+message);
}
}
複製代碼
到這裏一個完整的Spring Boot使用Redis進行消息的發佈與訂閱過程就打通了 ui