• java使用看门狗原理实现监听业务


    看门狗是什么

    看门狗,又叫 watchdog,从本质上来说就是一个定时器电路,一般有一个输入和一个输出,其中输入叫做喂狗,输出一般连接到另外一个部分的复位端,一般是连接到单片机。

    看门狗原本是一种定时器电路,但是可以借鉴它的运行模式,用来实现java程序开发的一些业务逻辑。

    看门狗原理

    看门狗的原理是,有一个定时器在循环计时,当有外界条件触发它执行后,刷新(重置)计时,一直等到计时完毕,还没有外界条件来触发,则会输出特定的指令或者回调。

    那么看门狗如何在java中应用呢?我举个场景:当有一个对象的状态变更很频繁,你需要保证数据一致性,将对象的最终状态更新到数据库中。当短时间内有大量的状态变更时,你如何解决更新数据库过于频繁的问题?

    上面列举的那个业务场景,我们就可以使用java看门狗来实现。每次状态更新看作是刷新看门狗计时,状态更新结束,看门狗计时结束,触发更新数据库。

    java实现看门狗

    我们还是用上面那个案例,短时间内大量且频繁的更新状态,要保证数据一致性,用看门狗来实现:

    1. /** 看门狗,用于监听状态变化 */
    2. public class StatusWatchDog {
    3. /** 刷新周期(秒) */
    4. private static final long SLEEP = 2;
    5. /** key为对象id,对象状态更新时会更新对应的value值为true */
    6. private static final Map MAP = new ConcurrentHashMap<>();
    7. /** 刷新看门狗 */
    8. public static void refresh(String id, Consumer callback) {
    9. if (MAP.isEmpty()) {
    10. MAP.put(id, true);
    11. watch(callback);
    12. } else {
    13. MAP.put(id, true);
    14. }
    15. }
    16. /** 监视对应的状态是否进行刷新,若固定周期内未刷新,则踢出map并进行回调 */
    17. private static void watch(Consumer callback) {
    18. Runnable runnable =
    19. () -> {
    20. while (!MAP.isEmpty()) {
    21. MAP.keySet()
    22. .forEach(
    23. id -> {
    24. if (MAP.get(id)) {
    25. MAP.put(id, false);
    26. }
    27. });
    28. try {
    29. TimeUnit.SECONDS.sleep(SLEEP);
    30. } catch (InterruptedException e) {
    31. LogAspect.error(e.getMessage());
    32. }
    33. MAP.keySet()
    34. .forEach(
    35. id -> {
    36. if (!MAP.get(id)) {
    37. MAP.remove(id);
    38. callback.accept(id);
    39. }
    40. });
    41. }
    42. };
    43. new Thread(runnable).start();
    44. }
    45. }

    使用时,我们只需要调用refresh方法,传入对象的id和回调函数即可,回调函数为更新当前状态到数据的方法。看门狗的刷新周期可以修改,根据你的业务需求调整,上述代码中写的是2秒,如果超过2秒还没有状态更新,那么就会将当前的状态更新到数据库中。如果后续还有状态更新,则会继续重复此过程。

    看门狗的使用场景

    上面我们列举了一种使用场景,那么看门狗在java应用中还有哪些使用场景呢?

    • 可以用作监听业务,当规定时间内没有收到触发消息则做出对应动作
    • 可以用作短时间内更新大量数据的缓冲,如上述案例,频繁短暂的更新某个字段
    • 可以用作redis分布式锁的续约,获取锁之后如果超时了,需要续约才能使用,避免死锁

    以上简单的列举了几种使用场景,看门狗原理在java中应用广泛,我们了解它的原理之后,就可以根据自身业务场景去使用。

  • 相关阅读:
    【Python-Spark(大规模数据)】
    【解惑】孜孜不倦,用足球赛程详解c#中的yield return用法
    【HTML5期末大作业】制作一个简单HTML我的班级网页(HTML+CSS+JS)
    Linux:程序地址空间/虚拟地址等相关概念理解
    搜索二叉树详解
    Jmeter+Ant+Git+Jenkins持续集成介绍
    PPT:Spire.Presentation for Java 7.12.0
    欧拉图相关的生成与计数问题探究
    [项目管理-6]:软硬件项目管理 - 项目沟通管理(渠道、方法)
    763.划分字母区间——之打开新世界
  • 原文地址:https://blog.csdn.net/Lin_xiaofeng/article/details/126054407