朋友们好啊,我是码农小胖哥。
今天有个同学问我在吗,我说什么事?
给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。
他说了两种选择,一种是用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 */@Beanpublic 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 */@Beanpublic RedisJobEventMessageListener redisEventMessageListener(RedisMessageListenerContainer redisMessageListenerContainer){ return new RedisJobEventMessageListener(redisMessageListenerContainer);}一个执行测试:
@Testpublic 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
原文转载:http://www.shaoqun.com/a/490380.html
笨鸟海淘:https://www.ikjzd.com/w/1550
中国邮政邮乐网:https://www.ikjzd.com/w/1776
1号团:https://www.ikjzd.com/w/2263
朋友们好啊,我是码农小胖哥。今天有个同学问我在吗,我说什么事?给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。他说了两种选择,一种是用DelayQueue,一种是用消息队列。他说,胖哥你能不能教我点招式混元功法,帮我完成这个需求。我说可以!我说你这两种都不好用,他不服气。我说那你写个DelayQueue来看看,他写不出来。他说你这估计也不会,我说我确实不会。这是JUC,传统底层开发是
飞书互动:飞书互动
麦言:麦言
八达通在哪里可以充值?:八达通在哪里可以充值?
疫情下的商机有哪些?疫情间不卖防疫物资还有什么能火爆的?:疫情下的商机有哪些?疫情间不卖防疫物资还有什么能火爆的?
中山德华湿地花海5月赏花攻略?德华湿地花海5月有哪些花看?:中山德华湿地花海5月赏花攻略?德华湿地花海5月有哪些花看?
No comments:
Post a Comment