支付渠道回调出问题如何主动查询 延时任务 ScheduledExecutorService
商户系统通过调用支付渠道的 API,以查询支付状态。这样可以在出现潜在问题时,及时获取交易的最新状态。
主动查询流程: 1.创建订单:用户在商户系统创建订单,并选择支付渠道。 2.调用支付接口:商户系统向支付渠道发起支付请求。 App或小程序上面完成支付。 3.记录订单状态:在数据库中记录订单的初始状态。 4.设置定时任务:在指定的时间间隔内,查询支付状态,如果回调未成功,则主动查询。
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(() -> {
// 查询支付状态
String status = queryPaymentStatus(orderID);
if (!status.equals("SUCCESS")) {
// 更新数据库状态
}
}, 0, 5, TimeUnit.MINUTES); // 每5分钟查询一次
5.更新状态:根据查询结果更新订单状态。
6.ScheduledExecutorService DEMO
package com.example.core.mydemo;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.concurrent.*;
public class ThreadTest {
private static ScheduledExecutorService scheduledExecutorService= Executors.newScheduledThreadPool(2);
public static void main(String[] args) throws Exception{
/**
* 回调函数
* output:
* Task result: Task completed at 1741943771385-Fri Mar 14 17:16:11 CST 2025
*/
Callable<String> task = new Callable<String>() {
@Override
public String call() throws Exception {
// 执行任务并返回结果
return "Task completed at " + System.currentTimeMillis() + "-" + new Date();
}
};
Future<String> future = scheduledExecutorService.schedule(task, 3, TimeUnit.SECONDS); // 延迟3秒执行任务
try {
System.out.println("Task result: " + future.get()); // 获取任务结果
} catch (Exception e) {
e.printStackTrace();
} finally {
// scheduledExecutorService.shutdown(); // 关闭执行器服务
}
/**
* output:
* 0000000000000000000Fri Mar 14 17:01:25 CST 2025
* 22222222222222222222222222222Fri Mar 14 17:01:27 CST 2025
* 111111111111111111111Fri Mar 14 17:01:30 CST 2025
*/
System.out.println("0000000000000000000" + new Date());
Thread.sleep(2000);
scheduledExecutorService.schedule(new Runnable() {
//@Override
public void run() {
//es尝试刷新一次
System.out.println("111111111111111111111" + new Date());
}
}, 3000, TimeUnit.MILLISECONDS);
System.out.println("22222222222222222222222222222" + new Date());
/**
* ScheduleAtFixedRate 两次任务之间的间隔时间,取决于每次任务执行的时间长短;
* 假如每个任务执行花费time时间,如果time>= period,则这次任务执行结束后 立刻执行下一次任务。
* 如果time<period , 则这次任务执行结束后 ,隔 period-time后执行下一次任务。
*
* output:
* 444444444Fri Mar 14 17:06:21 CST 2025 等于间隔了3秒(执行3秒,定时间隔3秒) 立即执行
* 444444444Fri Mar 14 17:06:24 CST 2025
* 444444444Fri Mar 14 17:06:27 CST 2025
*/
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
//@Override
public void run() {
//es尝试刷新一次
System.out.println("444444444" + new Date());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1000,3000, TimeUnit.MILLISECONDS);
/**
* ScheduleWithFixedDelay 不受任务执行时间长短影响,固定这次任务执行结束后隔x秒执行下一次.
* 不管任务花费多少时间,当这次任务执行结束,一定要等delay之后,再执行下一次任务。
*
* output:
* 55555555Fri Mar 14 17:06:21 CST 2025 等于间隔了6秒(执行3秒,定时间隔3秒)
* 55555555Fri Mar 14 17:06:27 CST 2025
* 55555555Fri Mar 14 17:06:33 CST 2025
*/
scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
//@Override
public void run() {
//es尝试刷新一次
System.out.println("55555555" + new Date());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 1000,3000, TimeUnit.MILLISECONDS);
}
}
7.其他应用 比如:配置模块初始化: 5分钟刷新配置
@PostConstruct
public void start(){
init();
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
logger.info("start to refresh config");
init();
}
},300,300,TimeUnit.SECONDS);
}