在java中如何在12小时后启动/安排活动

在java中如何在12小时后启动/安排活动,java,hibernate,struts2,Java,Hibernate,Struts2,我们正在开发用于预订航班、公共汽车票等的旅行应用程序。对于机票,最初将生成PNR(乘客姓名记录),通过PNR确认机票 问题是,如果在生成PNR后的12小时内未确认票证,则必须取消PNR。否则,我们将面临来自航空GDS提供商的处罚 到目前为止,我们已经编写了Cron调度程序,每15分钟执行一次。我们这样做有问题,也面临处罚。我不能每分钟都运行调度程序 如果未预订,在生成12小时后,如何取消PNR 由于这是标记为Java的,我建议您研究以下内容之一 这些是计划将来要执行的任务的标准解决方案

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

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

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


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

由于这是标记为Java的,我建议您研究以下内容之一


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

关于aioobe的建议,我还想看看和,因为我很确定这将是下一个问题;)

允许您计划一个任务在延迟后执行(在您的情况下为12小时)。但是,不能保证在所需的时间点执行。从文档中:

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


您可以使用
Timer
TimerTask
来执行此操作

 1. Write the code to fire an event in Timertask. 
 2. Schedule the TimerTask after 12 hours using schedule() method.
你可以用


是否检查了异步作业调度?

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

看来你的问题不在于如何触发事件。但更像是,即使你开枪,你也会受到惩罚。任何调度器,无论是石英、Java定时器还是Cron,都以同样的方式工作,即使在指定的时间,它们也会触发,如何通过使用调度器有效地满足我的需求。@Eswar-如果您对非事件驱动方法感兴趣,可以参考我的答案。不清楚他的问题是否是“如何在java中实现?”但即使他触发事件,他似乎也会受到惩罚。如果在创建计时器之后但在计时器之前重新启动JVM,会发生什么情况火灾?12个小时的等待时间很长。在我看来,任何使用非持久性计时器完成这类任务的方法都是自找麻烦。感谢您提供解决方案。我可以通过上述解决方案达到我的要求。但这是个好办法。我可以知道上述解决方案的优点和缺点吗