朋友们好啊,我是码农小胖哥。

今天有个同学问我在吗,我说什么事?

给我发个截图,我一看!噢,原来是帮忙搞个定时任务,还是动态的。

他说了两种选择,一种是用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

最新文章

  1. Texstudio中文乱码问题
  2. 浪潮 NF5240M3 ,NP5540M3 服务器安装2008 R2
  3. BOM之location对象
  4. 【Swift学习】Swift编程之旅---Subscripts下标(十六)
  5. 图解Storm
  6. qbxt十一系列三
  7. zboot/piggyback.c
  8. 解决错误提示: 未找到 Oracle 客户端和网络组件。
  9. Java字符串的最大长度
  10. poj 2406 Power Strings(KMP变形)
  11. ibatis resultMap 结果集映射
  12. Python自学笔记-面向对象相关(Mr seven)
  13. Css多列语法笔记
  14. spring 5.1.2 mvc RequestMappingHandlerMapping 源码初始化过程
  15. WPF-利用Blend写的平面控制闸门开关动画
  16. Linux虚拟机安装教程
  17. 开始使用 Vuejs 2.0 ---简单总结2
  18. 11、SpringBoot-CRUD-thymeleaf公共页面元素抽取
  19. Web后台任务处理
  20. 绝对让你理解Android中的Context

热门文章

  1. IDEA项目区模块文件变为红色解决办法
  2. go 结构体与方法
  3. C++20 多线程 std::jthread
  4. tomcat 启动失败
  5. BlockCanary界面卡顿检测
  6. 自定义Jackson2HttpMessageConverter,适应.html后缀url
  7. java-try catch中return在finally之前 还是之后执行
  8. java前后端开发需掌握的框架及技术
  9. Moment.js常见用法总结
  10. 关于transition中嵌套keep-alive的问题解决