朋友們好啊,我是碼農小胖哥,
今天有個同學問我在嗎,我說什么事?
給我發個截圖,我一看!噢,原來是幫忙搞個定時任務,還是動態的,
他說了兩種選擇,一種是用DelayQueue,一種是用訊息佇列,
他說,胖哥你能不能教我點招式混元功法,幫我完成這個需求,
我說可以!
我說你這兩種都不好用,他不服氣,
我說那你寫個DelayQueue來看看,他寫不出來,
他說你這估計也不會,我說我確實不會,
這是 JUC,傳統底層開發是要講基礎的,必須融會貫通,我只會調包,
這種定時任務我用 Redis 更簡單些,
他讓我寫個 DEMO,我說可以!
我一說,他啪就發了個表情
,
很快啊,我就打開 IDEA,一個 DEMO 就出來了,
一個重寫了 Redis 的 Key 失效監聽器:
/**
* 當redis 中的key過期時,觸發一個事件,并不會準點觸發事件,適用于時間不是特別敏感的觸發需求,
* 我們可以算好需要執行的時間間隔作為key失效時間,這樣就可以保證到點執行邏輯了,
*/
public class RedisJobEventMessageListener extends KeyExpirationEventMessageListener {
/**
* Instantiates a new Redis event message listener.
*
* @param listenerContainer the listener container
*/
public RedisEventMessageListener(RedisMessageListenerContainer listenerContainer) {
super(listenerContainer);
}
@Override
protected void doHandleMessage(Message message) {
String key = message.toString();
// 這個就是過期的key ,過期后,也就是事件觸發后對應的value是拿不到的,
// 這里實作業務邏輯,如果是服務器集群的話需要使用分布式鎖進行搶占執行,
System.out.println("key = " + key);
System.out.println("end = " + LocalDateTime.now());
}
}
一個監聽器的配置:
/**
* Redis 訊息監聽器容器.
*
* @param redisConnectionFactory the redis connection factory
* @return the redis message listener container
*/
@Bean
public RedisMessageListenerContainer redisMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
RedisMessageListenerContainer redisMessageListenerContainer = new RedisMessageListenerContainer();
redisMessageListenerContainer.setConnectionFactory(redisConnectionFactory);
return redisMessageListenerContainer;
}
/**
* Redis 定時任務監聽器注冊為Bean.
*
* @param redisMessageListenerContainer the redis message listener container
* @return the redis event message listener
*/
@Bean
public RedisJobEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
return new RedisJobEventMessageListener(redisMessageListenerContainer);
}
一個執行測驗:
@Test
public void redisJobTest() {
// 呼叫 redisTemplate 物件設定一個10s 后過期的鍵,不出意外 10s 后鍵過期后會觸發事件列印結果
redisTemplate.boundValueOps("job").set("10s",10, TimeUnit.SECONDS);
System.out.println("begin = " + LocalDateTime.now());
try {
// 測驗需要休眠才能看到結果
Thread.sleep(20000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// ---------測驗結果---------
// begin = 2020-11-18T00:19:09.272
// key = job
// end = 2020-11-18T00:19:19.369
}
寫完之后自然是傳統編程思路點到為止,我把代碼發給他,我打算放松一下,摸一摸魚,
我本來想讓他關注我,我想著他會主動去關注,
我大意了,沒有說,
然后十分鐘后他告訴我他搞定了,而且沒有關注我,
我說同學你不講規矩,你不懂,
他忙說對不起,我不懂規矩啊!
我說年輕人,
不講規矩,
來,
白嫖!
我五年經驗的小碼農,
這好嗎?這不好,
我勸這位同學,
耗子尾汁,
好好反思,
好好關注,
好好點贊,
好好評論,
要以和為貴,要講規矩,
不要老是白嫖,
多多關注:碼農小胖哥 ,
謝謝同學們!
關注公眾號:Felordcn 獲取更多資訊
個人博客:https://felord.cn
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/223631.html
標籤:其他
