springboot2 如何使一个方法持续运行,用来扫描数据库,发现条件匹配的行就进行业务处理?
买家付款的钱,不能当时计算到商户余额当中,要到第二天才能计算到商户余额。
期间如果发生退款,就不会计算。
而且,因为涉及到金额,容错率低,要保证一直扫描,都是没有遗漏的。
所以。
我想写一个持续运行的方法,用来扫描数据库,发现条件匹配的行就进行业务处理。
我目前查到的方法有:
1、
@postController
for……/while(true)
-->select ……
-->do……
-->sleep……
2、@Scheduled(cron = "0 0 0/1 ?") 搭配上面方法
回答:
默认你是单机模式。
分享一下我最常用的启动一个任务的方式,停止与启动都与 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做中间态处理,备份;
对于状态表在页面也可以进行展示,让业务看到处在交易未完成阶段的数据,这样也可以对业务进行监控,超时未关闭等状态的及时处理。
以上是 springboot2 如何使一个方法持续运行,用来扫描数据库,发现条件匹配的行就进行业务处理? 的全部内容, 来源链接: utcz.com/p/944972.html