朋友们好啊,我是码农小胖哥。
今天有个同学问我在吗,我说什么事?
给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。
他说了两种选择,一种是用DelayQueue
,一种是用消息队列。
他说,胖哥你能不能教我点招式混元功法,帮我完成这个需求。
我说可以!
我说你这两种都不好用,他不服气。
我说那你写个DelayQueue
来看看,他写不出来。
他说你这估计也不会,我说我确实不会。
这是 JUC,传统底层开发是要讲基础的,必须融会贯通,我只会调包。
这种定时任务我用 Redis 更简单些。
他让我写个 DEMO,我说可以!
我一说,他啪就发了个表情。
很快啊,我就打开 IDEA,一个 DEMO 就出来了。
一个重写了 Redis 的 Key 失效监听器:
-
/**
-
* 当redis 中的key过期时,触发一个事件。
-
* 我们可以算好需要执行的时间间隔作为key失效时间,这样就可以保证到点执行逻辑了。
-
*/
-
public class RedisEventMessageListener 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 Key失效监听器注册为Bean.
-
*
-
* @param redisMessageListenerContainer the redis message listener container
-
* @return the redis event message listener
-
*/
-
@Bean
-
public RedisEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){
-
return
new RedisEventMessageListener(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
-
}
写完之后自然是传统编程思路点到为止,我把代码发给他,我打算放松一下,摸一摸鱼。
我本来想让他给我公众号文章转发、再看、点赞,我想着他会主动去点赞。
我大意了,没有说。
然后两分钟后他告诉我他搞定了,但是并没有关注我。
我说同学你不讲规矩,你不懂。
他忙说对不起,我不懂规矩啊!
我说年轻人,
不讲规矩,
来,
白嫖!
我五年经验的小码农。
这好吗?这不好。
我劝这位同学,
耗子尾汁。
好好反思。
赶紧关注、点赞、转发、再看。
码农们要以和为贵,要讲规矩,
不要老是白嫖。
多多关注:码农小胖哥 。
谢谢同学们!
Spring Security 实战干货:OAuth2授权回调的处理机制
转载:https://blog.csdn.net/qq_35067322/article/details/109792788
查看评论