Quartz Scheduler突然停止运行,没有异常错误

时间:2009-03-06 09:54:01

标签: java quartz-scheduler

我有一些石英工作,每天晚上7点运行。突然间它无法运行。我检查我的server.log并没有抛出异常。任何人都知道可能是什么问题?

提前致谢

7 个答案:

答案 0 :(得分:12)

我有一个类似的问题,但问题是,我在石英属性中有10个线程石英默认线程数,当我进行线程转储*我发现我在阻止 stat中有10个工作,这意味着我无法再运行任何线程。

快速解决此问题,以增加quartz属性中线程池中的线程数。

实际修复程序正在检查我的代码,以了解为什么我有10个被阻止的线程。

*做线程转储你可以使用 kill -3< java进程号> ,它将线程转储打印到您的应用程序标准输出,即如果您运行tomcat,则可以在 catalina.out 日志文件中找到它

答案 1 :(得分:6)

在我的情况下,我有一个与数据库的开放连接。当我没有更多连接可用时,我的线程仍然在等待。因为我无法开始任何其他工作,所以什么也没发生,一切都被阻止了。 我的建议是检查您是否有可能需要发布的阻止资源。

答案 2 :(得分:2)

如果您使用数据库存储作业,请检查触发器的trigger_state。现在我看到了类似的问题(或者至少它有类似的症状)。

每分钟运行一次的作业会使触发器处于“已获取”状态,并且永远不会再次运行。和你一样,我没有看到日志。

我也看到了同一问题的不同原因。同样,作业刚停止运行,但触发器未处于“已获取”状态。到目前为止,我不知道原因。

到目前为止我所知道的是调度程序线程正在等待一个免费的工作线程。看起来所有工作线程都在等待信号量以更新其计划。我还没有得到一个线程转储来验证工作线程正在等待什么。

我正在运行Quartz 1.6.1 RC1。请参阅此错误报告:http://jira.opensymphony.com/browse/QUARTZ-668

我认为这就是我所看到的。

答案 3 :(得分:2)

检查是否有任何作业正在抛出异常。将您的Job exe代码放在try catch块中,跟踪任何异常以解决问题。

答案 4 :(得分:1)

我有一个类似的问题,不幸的是,以上答案都没有帮助我弄清楚我的问题。我正在使用石英2.3.2版本。首先,我同意其他一些观点,其中调度程序未启动的大多数情况是由于线程争用条件造成的,线程争用条件被阻塞并试图从进入临界区的线程中获取标志,并且该标志不会释放它。这只是闻到了一种不好的代码,但是无论如何,我不想再说其他人一样的话。我想提出解决方案,为您提供解决问题的方法。

假设您使用Cron调度程序,如下所示,我将提供详细示例

这是SimpleJob类

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Date;

public class SimpleJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);

    public SimpleJob() {
    }

    public void execute(JobExecutionContext context)
            throws JobExecutionException {

        // This job simply prints out its job name and the
        // date and time that it is running
        JobKey jobKey = context.getJobDetail().getKey();
        _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
    }

}

这是你的主要课程

import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import static org.quartz.CronScheduleBuilder.cronSchedule;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.TriggerBuilder.newTrigger;

public class CronTriggerExample {

    public void run() throws Exception {
        Logger log = LoggerFactory.getLogger(CronTriggerExample.class);

        log.info("------- Initializing -------------------");

        // First we must get a reference to a scheduler
        JobDetail job = newJob(SimpleJob.class)
                .withIdentity("job1", "group1").build();

        CronTrigger trigger = newTrigger()
            .withIdentity("trigger1", "group1")
            .withSchedule(cronSchedule("10 10/5 * ? * *").withMisfireHandlingInstructionFireAndProceed())
            .build();
        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }

    public static void main(String[] args) throws Exception {

        CronTriggerExample example = new CronTriggerExample();
        example.run();
    }
}

下面的cron表达式表示从每小时的分钟:10开始,每5分钟从每秒10点开始。

cronSchedule("10 10/5 * ? * *")

如果您发现最有趣的部分是

withMisfireHandlingInstructionFireAndProceed()

这是解决您的问题的关键,如果在不点火情况下感觉到触发器,它会指示您的调度程序立即被解雇。另一种情况是使用

withMisfireHandlingInstructionDoNothing()

在发生误触发的情况下,cronTrigger将在调度程序已设置的开始时间下一次触发。例如,在我们的示例中,从每小时的分钟:10开始,每隔5分钟在第二秒:10。

答案 5 :(得分:0)

我有类似但有些不同的问题。我的调度程序在开发环境中运行良好。在这个调度程序中,我正在做更新事务等工作。

当我们将构建移动到生产时,调度程序运行良好,一切都很好,直到星期六。星期六我的调度员突然停了下来。我没有在我的应用服务器(OC4J)中找到与调度程序相关的任何异常。

我使用的是quartz-1.5.2版本。我无法追查问题的实际根本原因。

我在启动应用程序服务器时启动调度程序。如果出现问题,它就会停止工作。然后我没有机会启动它们。

我认为如果我通过使用一些jsp请求再次调用init servlet来启动调度程序会产生差异。这就像看到配置文件(我们的调度程序的健康状况并再次启动它们)。如果你有更好的方法来启动调度程序,那么请建议我。

答案 6 :(得分:-1)

是的,在quartz.properties中将线程数从7增加到10似乎正在解决这个问题。