如何在时间窗口中运行开放式石英作业,然后用弹簧干净地退出

时间:2014-01-29 20:39:30

标签: spring quartz-scheduler

我有一个石英作业,可以更新数据库中的某些记录。由于要更新的​​记录数量巨大,因此它将在每天晚上1点到凌晨3点之间以100个批次进行,每天2小时。

因此,如果它在凌晨3点到期时处理作业,我希望它完成处理当前批次的100条记录,然后干净地退出。怎么能实现这一目标?可以单独使用cron表达式完成还是有一些机制来实现这种正常关闭?

我使用spring的SchedulerFactoryBeanMethodInvokingJobDetailFactoryBean类在我的应用程序上下文xml中配置作业。

我的工作实施方法的一些伪代码。

public void updateRecords()
{
    while(true) // i need to replace true with some other logic to exit from loop at scheduled time.
    {
        // 1. select 100 records
        // 2. update 100 records
        // 3. commit
    }
}

1 个答案:

答案 0 :(得分:1)

运行updateRecords时,存储System.currentTimeMillis并查看while循环中的时间是否超过+ 2 * 60 * 60 * 1000 ms。

public void updateRecords()
{
    long jobStartedAt = System.currentTimeMillis();
    long twoHoursLater = jobStartedAt + 2 * 60 * 60 * 1000; //2 hours, 60 minutes/hour, 60 seconds/minute, 1000 ms/second
    while(System.currentTimeMillis() < twoHoursLater) 
    {
        // 1. select 100 records
        // 2. update 100 records
        // 3. commit
    }
}

此外: 根据您的数据库属性,批处理中的100个作业可能有点小到高效。不要害怕尝试更大的批次。

如果工作需要很长时间,那可能是因为索引很重。如果您有可能,请在执行大规模(哑)批处理之前删除索引,然后重建它们,如果批处理不明确需要它们。索引的每次更新都可以呈现比单次更改记录更多的磁盘写入。

相关问题