我们正在开发预订航班,公交车票等的旅行申请。对于机票,最初将生成PNR(乘客姓名记录),通过PNR确认票。
问题是,如果在生成PNR后12小时内未确认票证,则必须取消PNR。如果没有,我们将面临Air GDS提供商的处罚。
到目前为止,我们已经编写了Cron Scheduler,它每15分钟就完成一次。我们这样做有问题,也面临惩罚。我不能每分钟都运行调度程序。
如果没有预订,如何在生成12小时后取消PNR。
答案 0 :(得分:7)
答案 1 :(得分:3)
除了ajoobe建议之外,我还会看一下ScheduledExecutorService和Cancelling scheduled executor,因为我很确定这是下一个问题;)
答案 2 :(得分:1)
您可以使用Timer
和TimerTask
。
1. Write the code to fire an event in Timertask.
2. Schedule the TimerTask after 12 hours using schedule() method.
答案 3 :(得分:1)
您可以使用Quartz Scheduler
你检查过异步作业调度吗?
答案 4 :(得分:1)
aioobe为解决此类问题提供了一些很好的参考。但是,如果你想解决这个问题而不必担心计时器或其他可能会在你需要关闭和重启的情况下消失的瞬态事件,我建议你也考虑一个简单的方法:
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();
然后,您的平台将自动查询并删除任何超过12小时的记录,间隔为30秒。
答案 5 :(得分:0)
Timer.schedule(TimerTask, long)允许您在延迟一段时间后安排执行任务(在您的情况下为12小时)。但是,不能保证在所需的时间点执行。来自文档:
此课程不提供实时保证:它安排任务 使用Object.wait(long)方法。
它可能会或可能不会如您所愿。