springboot2 如何使一个方法持续运行,用来扫描数据库,发现条件匹配的行就进行业务处理?

作者站长头像
站长
· 阅读数 11

买家付款的钱,不能当时计算到商户余额当中,要到第二天才能计算到商户余额。期间如果发生退款,就不会计算。而且,因为涉及到金额,容错率低,要保证一直扫描,都是没有遗漏的。所以。我想写一个持续运行的方法,用来扫描数据库,发现条件匹配的行就进行业务处理。

我目前查到的方法有:

1、@postControllerfor……/while(true)-->select ……-->do……-->sleep……

2、@Scheduled(cron = "0 0 0/1 ?") 搭配上面方法

回复
1个回答
avatar
test
2024-07-11

默认你是单机模式。

分享一下我最常用的启动一个任务的方式,停止与启动都与 spring boot 的容器周期绑定。

@PostConstruct 是启动成功后执行,@PreDestroy 容器停止前执行。

@Scheduled 我一直不喜欢用,我认为它不够灵活,实现又是个黑盒子,这种任务,掌握在自己手里比较放心。

public class Monitor implements Runnable {

    private Thread thread;
    private boolean runFlag = true;

    @PostConstruct
    void init() {
        thread = new Thread(this);
        thread.start();
    }

    @PreDestroy
    void destroy() {
        runFlag = false;
        try {
            thread.join();
        } catch (InterruptedException e) {
            log.error("", e);
        }
    }

    @Override
    public void run() {
        while (runFlag) {
            // TODO

            try {
                Thread.sleep(5000);
            } catch (Exception e) {
                log.error("", e);
            }
        }
    }
}
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容