26

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

提前致谢

4

6 回答 6

15

我有一个类似的问题,但问题是,我在石英属性中有 10 个线程石英默认线程数,当我进行线程转储*时,我发现我在阻塞状态中有 10 个作业,这意味着我不能再运行了线程。

快速修复此问题以增加石英属性中线程池中的线程数。

实际的修复是查看我的代码以了解为什么我有 10 个阻塞线程。

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

于 2011-04-11T18:30:38.133 回答
8

就我而言,我与数据库有一个开放的连接。当我没有更多可用的连接时,我的线程一直在等待。由于我无法开始任何其他工作,所以什么都没有发生,一切都被阻止了。我的建议是让您检查是否有任何可能需要释放的阻塞资源。

于 2014-01-20T14:09:47.757 回答
4

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

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

我也看到了相同问题的不同原因。同样,作业只是停止运行,但触发器未处于“ACQUIRED”状态。到目前为止我还不知道原因。

到目前为止我所知道的是调度程序线程正在等待一个空闲的工作线程。看起来所有的工作线程都在等待一个信号量来更新他们的日程安排。我还无法获得线程转储来验证工作线程正在等待什么。

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

我想这就是我所看到的。

于 2009-05-05T13:13:54.227 回答
2

检查是否有任何作业抛出异常。将您的 Job exe 代码放入 try catch 阻止跟踪任何异常以解决问题。

于 2009-11-10T16:39:29.627 回答
1

我有一个类似的问题,不幸的是,以上答案都没有帮助我找出我的问题。我使用的是quartz-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 分钟,从每小时 10 分钟开始,每 5 分钟一次。

于 2020-03-10T20:33:24.753 回答
0

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

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

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

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

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

于 2011-11-29T11:03:20.693 回答