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

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

我目前查到的方法有:

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

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

回复
阅读 1.2k
3 个回答

默认你是单机模式。

分享一下我最常用的启动一个任务的方式,停止与启动都与 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);
            }
        }
    }
}

你这个明显写的是第二天,那就不需要每时每刻来扫描啊,只晚上某个点扫描一次就行了,然后出错的记录下来,早晨自动推送给相关技术来手动处理。
除了@Scheduled也可以用流行的quartz相关库。

定时任务没有问题,
这里的业务处理有些问题,
对于低容错率的事件,你需要一个兜底方案。定时任务扫描的表不应该是结果表,而应该是一个带有状态的记录表,记录事件状态。当处理处于中间状态的事件无法达到最终状态的时候进行补偿操作即对账。
如果对账结果不满意可进行人工操作。定时任务可以使用触发器代替,或者对于贯彻整个业务的唯一id做中间态处理,备份;
对于状态表在页面也可以进行展示,让业务看到处在交易未完成阶段的数据,这样也可以对业务进行监控,超时未关闭等状态的及时处理。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏