我在下面编写代码,我正在运行两个工作。 首先是10秒的间隔,另一个是3秒的间隔。 但最终在某些时候它们会同时执行。 有没有机制来避免这种情况

    JobDetail jDetail = new JobDetail("Job1", "group1", MyJob.class);
    CronTrigger crTrigger = new CronTrigger("cronTrigger", "group1", "0/10 * * * * ?");
    sche.scheduleJob(jDetail, crTrigger);

    jDetail = new JobDetail("Job2","group2",MyJob2.class);
    crTrigger = new CronTrigger("cronTrigger2","group2","0/3 * * * * ?");
    sche.scheduleJob(jDetail, crTrigger);

===============>>#1 票数:3

没有完全回答你的问题,但这是你如何查询以线程安全方式运行的东西:

//sched is your org.quartz.Scheduler
        synchronized (sched) {
            JobDetail existingJobDetail = sched.getJobDetail(jobName, jobGroup);
            if (existingJobDetail != null) {
                List<JobExecutionContext> currentlyExecutingJobs = (List<JobExecutionContext>) sched.getCurrentlyExecutingJobs();
                for (JobExecutionContext jec : currentlyExecutingJobs) {

                    if (existingJobDetail.equals(jec.getJobDetail())) {
                        // This job is currently executing
                    }
                }
            }

===============>>#2 票数:3

将Quartz线程池配置为只有一个线程。

org.quartz.threadPool.threadCount=1

===============>>#3 票数:2 已采纳

您可以创建一个辅助对象来使两个作业同步:

//In the base class 
public static Object lock = new Object();

//In the first class
public void execute() {
    synchronized(lock) {
        //do stuff
    }
}

//In the second class
public void execute() {
    synchronized(lock) {
        //do stuff
    }
}

有关同步的更多信息,请访问: http//docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

===============>>#4 票数:1

你有没有尝试过:

org.quartz.jobStore.isClustered: true

或者,您将工作变为有状态的工作(并将isClustered设置为true),并且shoujld解决您的问题。 (糟糕,不推荐使用StatefulJob;请使用DisallowConcurrentExecution。)

  ask by user968880 translate from so

未解决问题?本站智能推荐:

1回复

约束两个作业不要在Quartz-Scheduler中同时运行

在Quartz-Scheduler中,是否可以定义关于作业的执行约束? 实际上,我有两个实现接口Job的类:JobA和JobB。 JobA将每分钟安排一次。 JobB将每小时安排一次。 我不希望JobA和JobB同时运行。 注意:JobA和JobB不会做同样的事情。
1回复

用Java中的Quartz运行两个作业

我有Quartz编码如下,第一个作业完美运行: 但我发现Job2是Job1的一个完全独立的工作,它不会执行。 调度程序使用Java中的侦听器启动。 我也尝试过使用scheduler.addJob(jd,true); 但没有变化。 我在Windows 7上通过JVM运行Java
2回复

Quartz在启动时运行作业

我正在尝试每天在特定时间和服务器启动时运行一个工作,以确保数据是最新的。 不幸的是我不知道如何设置石英在使用xml文件的服务器启动时运行。 这是我的日程安排:
2回复

计划进程在Openbravo中同时运行两次(使用Quartz)

我不太确定这是更多的Openbravo问题还是更多的Quartz问题,但我们有一些手动流程通过Openbravo ProcessRequest对象(OB v2.50MP24)按计划运行,但似乎流程正在运行两次,在同一时间。 Openbravo扩展了Quartz平台以进行调度。 我试图通过确保
1回复

防止在Quartz Scheduler中同时执行两个或多个作业

就像标题一样,我有几个作业可以同时设置触发时间,但是我不希望一次执行所有作业。 因为我担心这可能会导致系统过热。 有什么方法可以配置触发器,使触发器的执行时间在定义的偏移量之间变化? 例如: 计划在下午12点执行的作业2:作业1和作业2 下午12点:执行Job1。 在12:
1回复

当应用程序有两个实例时,如何避免同时执行石英作业

我有一个在两个不同实例上运行的Spring Web应用程序。 这两个实例彼此不知道,它们在不同的服务器上运行。 该应用程序具有计划的Quartz作业,但是我的问题是该作业不应在实例上同时执行,因为它的邮件发送作业可能会导致重复发送电子邮件。 我正在使用RAMJobStore,但由于
1回复

Quartz:单线程有时运行两次

我的应用程序每天触发3次,有时同一调度程序立即完成两次后运行两次。 此行为不一致。 石英配置详细信息: 触发器: 如果有人遇到相同问题,请帮助我解决此问题。 我发现很难找到根本原因,有时候为什么同一份工作要运行两次。
1回复

由于两个服务器实例,同一石英作业运行两次

我有这个问题:我的应用有一个石英调度程序,每X分钟运行一次任务。 此应用程序部署在两个服务器实例中,因此每个实例都在同时执行任务。 我只想同时执行一个任务。 我们已经用Spring配置了Quartz,我们的应用程序服务器是WAS。 您建议哪些选项?
2回复

如何避免在Quartz Schedular中通过多个线程触发同一作业?

我每隔一分钟就配置我的工作。 但是有时同一项作业会以毫秒级的差异被多个线程触发。 我正在使用quartz1.6。 有人可以帮忙吗? 另外,quartz.property文件中threadPool选项的用法是什么。
2回复

如何检查作业是否在Quartz Framework中运行

我想在我的应用程序中使用Quartz Framework 。 调度程序中有两个作业。 现在我想检查job1是否正在运行。 我怎么检查? 我曾试图谷歌但未能找到解决方案。 我正在关注Quartz发行版中的第一个示例。