我们正在开发用于预订机票、巴士票等的旅行应用程序。对于机票,最初将生成 PNR(乘客姓名记录),通过该 PNR 确认机票。
问题是,如果在生成 PNR 后 12 小时内未确认客票,则必须取消 PNR。否则,我们将面临 Air GDS 供应商的处罚。
到目前为止,我们已经编写了每 15 分钟执行一次此操作的 Cron 调度程序。我们这样做有问题,也面临处罚。我不能每分钟都运行调度程序。
如果未预订,在生成 12 小时后如何取消 PNR。
除了 aioobe 建议之外,我还会查看ScheduledExecutorService和Canceling scheduled executor,因为我很确定这将是下一个问题;)
您可以通过使用Timer
和来做到这一点TimerTask
。
1. Write the code to fire an event in Timertask.
2. Schedule the TimerTask after 12 hours using schedule() method.
您可以使用Quartz 调度程序
你检查过异步作业调度吗?
aioobe 为解决此类问题提供了一些很好的参考。但是,如果您想解决问题而不必担心如果 JVM 需要关闭和重新启动时可能会消失的计时器或其他瞬态事物,我建议您还考虑一种简单的方法:
public class PNRExpirationThread extends Thread {
@Override
public void run() {
while (true) { //or while !stop, or while Server.isRunning(), you get the idea
try {
Thread.sleep(30000); //wait 30 seconds; adjust this to your liking
//it's pseudo-SQL, but you get the idea; I'm assuming your data model has the required fields for this to work
Database.executeTxn("DELETE FROM pnrRecords WHERE NOW() - createDate > 12h AND confirmed = 0");
}
catch (Throwable ignored) {
}
}
}
}
然后,将一些代码添加到服务器的启动/初始化例程中,例如:
//keep a reference to this if you want to terminate the thread gracefully at shutdown time
new PNRExpirationThread().start();
然后您的平台将每隔 30 秒自动查询并删除任何超过 12 小时的记录。
Timer.schedule(TimerTask, long)允许您安排任务在延迟一段时间后执行(在您的情况下为 12 小时)。但是,不能保证在所需的时间点执行。从文档:
此类不提供实时保证:它使用 Object.wait(long) 方法安排任务。
它可能会也可能不会如你所愿。