如何在java中12小时后触发/安排事件

时间:2012-08-24 05:33:48

标签: java hibernate struts2

我们正在开发预订航班,公交车票等的旅行申请。对于机票,最初将生成PNR(乘客姓名记录),通过PNR确认票。

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

到目前为止,我们已经编写了Cron Scheduler,它每15分钟就完成一次。我们这样做有问题,也面临惩罚。我不能每分钟都运行调度程序。

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

6 个答案:

答案 0 :(得分:7)

由于这是标记的Java,我建议您查看以下其中一个

这些是计划将来执行的任务的标准解决方案。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

您可以使用TimerTimerTask

来完成此操作
 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)方法。

它可能会或可能不会如您所愿。