2

我们正在开发用于预订机票、巴士票等的旅行应用程序。对于机票,最初将生成 PNR(乘客姓名记录),通过该 PNR 确认机票。

问题是,如果在生成 PNR 后 12 小时内未确认客票,则必须取消 PNR。否则,我们将面临 Air GDS 供应商的处罚。

到目前为止,我们已经编写了每 15 分钟执行一次此操作的 Cron 调度程序。我们这样做有问题,也面临处罚。我不能每分钟都运行调度程序。

如果未预订,在生成 12 小时后如何取消 PNR。

4

6 回答 6

7

由于这被标记为 Java,我建议您查看以下内容之一

这些是调度将来要执行的任务的标准解决方案。

于 2012-08-24T05:36:06.497 回答
3

除了 aioobe 建议之外,我还会查看ScheduledExecutorServiceCanceling scheduled executor,因为我很确定这将是下一个问题;)

于 2012-08-24T05:40:45.513 回答
1

您可以通过使用Timer和来做到这一点TimerTask

 1. Write the code to fire an event in Timertask. 
 2. Schedule the TimerTask after 12 hours using schedule() method.
于 2012-08-24T05:43:25.940 回答
1

您可以使用Quartz 调度程序

你检查过异步作业调度吗?

于 2012-08-24T05:47:26.140 回答
1

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 小时的记录。

于 2012-08-24T05:49:42.163 回答
0

Timer.schedule(TimerTask, long)允许您安排任务在延迟一段时间后执行(在您的情况下为 12 小时)。但是,不能保证在所需的时间点执行。从文档:

此类不提供实时保证:它使用 Object.wait(long) 方法安排任务。

它可能会也可能不会如你所愿。

于 2012-08-24T05:40:54.863 回答