springboot2 如何使一个方法持续运行,用来扫描数据库,发现条件匹配的行就进行业务处理?
买家付款的钱,不能当时计算到商户余额当中,要到第二天才能计算到商户余额。期间如果发生退款,就不会计算。而且,因为涉及到金额,容错率低,要保证一直扫描,都是没有遗漏的。所以。我想写一个持续运行的方法,用来扫描数据库,发现条件匹配的行就进行业务处理。
我目前查到的方法有:
1、@postControllerfor……/while(true)-->select ……-->do……-->sleep……
2、@Scheduled(cron = "0 0 0/1 ?") 搭配上面方法
回复
1个回答

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);
}
}
}
}
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容