支付渠道回调出问题如何主动查询 延时任务 ScheduledExecutorService
支付渠道回调出问题如何主动查询 延时任务 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); }