非同步訊息的方式有很多,這篇部落格介紹如何使用redis進行釋出訂閱,
完成這個示例只需要三個檔案
1.redis訊息監聽配置
@Configuration
public class RedisListenerConfig {
/**
* redis訊息監聽器容器
* 可以新增多個監聽不同話題的redis監聽器,只需要把訊息監聽器和相應的訊息訂閱處理器繫結,該訊息監聽器
* 通過反射技術呼叫訊息訂閱處理器的相關方法進行一些業務處理
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter
) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//可以新增多個 messageListener
container.addMessageListener(listenerAdapter, new PatternTopic("index"));
return container;
}
/**
* 訊息監聽器介面卡,繫結訊息處理器,利用反射技術呼叫訊息處理器的業務方法
* @param redisReceiver
* @return
*/
@Bean
MessageListenerAdapter listenerAdapter(RedisReceiver redisReceiver) {
System.out.println("訊息介面卡進來了");
return new MessageListenerAdapter(redisReceiver, "receiveMessage");
}
//使用預設的工廠初始化redis操作模板
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
}
2.訊息處理
@Service
public class RedisReceiver {
public void receiveMessage(String message) {
System.out.println("訊息來了:"+message);
//這裡是收到通道的訊息之後執行的方法
}
}
3.一個傳送訊息的定時器
//定時器
@EnableScheduling
@Component
public class TestSenderController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
//向redis訊息佇列index通道釋出訊息
@Scheduled(fixedRate = 3000)
public void sendMessage(){
stringRedisTemplate.convertAndSend("index",String.valueOf(Math.random()));
}
}
執行結果如圖
本篇部落格地址:https://gitee.com/zhao-baolin/redis-message