java 石英工作没有开始

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11208327/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-31 04:14:56  来源:igfitidea点击:

Quartz Jobs Not Kicking Off

javaquartz-scheduler

提问by IAmYourFaja

Edit: I am using quartz-2.1.5.jar. Here's the summary of my classes:

编辑:我正在使用quartz-2.1.5.jar. 以下是我的课程总结:

HttpPollingJobextends PollingJobextends ScheduledJobimplements org.quartz.Job

HttpPollingJob扩展PollingJob扩展ScheduledJob工具org.quartz.Job

Specifically:

具体来说:

1) ScheduledJobimplements Quartz Job(abstract base class for all my Jobtypes):

1)ScheduledJob实现 Quartz Job(我所有Job类型的抽象基类):

import org.quartz.Job;
import org.quartz.Trigger;

public abstract class ScheduledJob implements Job {
    private Trigger trigger;

    public ScheduledJob() {
        this(null);
    }

    public ScheduledJob(Trigger trig) {
        super();

        if(trig == null)
            trig = getDefaultTrigger();

        setTrigger(trig);
    }

    public Trigger getTrigger() {
        return trigger;
    }

    public void setTrigger(final Trigger trig) {
        trigger = trig;
    }

    protected abstract Trigger getDefaultTrigger();
}

2) PollingJobextends ScheduledJob- all "pollers" poll some resource/endpoint with a specific frequency:

2)PollingJob扩展ScheduledJob- 所有“轮询器”以特定频率轮询某些资源/端点:

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;

import com.me.jobs.ScheduledJob;

public abstract class PollingJob extends ScheduledJob {
    private static long DEF_FREQUENCY = 10 * 1000; // 10 secs
    private String name;    
    private long frequency;

    public PollingJob(final String nm) {
        this(nm, DEF_FREQUENCY);
    }

    public PollingJob(final String nm, final long freq) {
        super();

        setName(nm);
        setFrequency(freq);
    }

    public abstract void poll(JobExecutionContext context);

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        poll(context);      
    }

    public String getName() {
        return name;
    }

    public void setName(final String nm) {
        name = nm;
    }

    public long getFrequency() {
        return frequency;
    }

    public void setFrequency(final long freq) {
        frequency = freq;
    }

    protected final Trigger getDefaultTrigger()  {
        TriggerBuilder<?> triggerBuilder = TriggerBuilder.newTrigger()
            .startNow()
            .withSchedule(SimpleScheduleBuilder.simpleSchedule()
            .withIntervalInMilliseconds(DEF_FREQUENCY));

        return triggerBuilder.build();
    }
}

3) HttpPollingJobextends PollingJob- "HTTP pollers" poll a web server (using HTtpClient):

3)HttpPollingJob扩展PollingJob- “HTTP 轮询器”轮询 Web 服务器(使用 HTtpClient):

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.quartz.JobExecutionContext;

import com.me.MonitoredEvent;
import com.me.MonitoredEventRegistrar;

public class HttpPollingJob extends PollingJob {
    private String serverURL;
    private org.slf4j.Logger logger =
        org.slf4j.LoggerFactory.getLogger(HttpPollingJob.class);

    public HttpPollingJob(final String nm, final String server) {
        super(nm);

        setServerURL(server);
    }

    public String getServerURL() {
        return serverURL;
    }

    public void setServerURL(final String server) {
        serverURL = server;
    }

    @Override
    public final void poll(JobExecutionContext context) {
        MonitoredEvent event = null;

        try {
            // This is where we would use HttpClient to connect to a web server and poll it.
            System.out.println("Job fired!");
        }
        catch(Throwable thrown) {
            logger.error(thrown.getMessage());
        }
    }
}

4) JobDriver- defines several HttpPollingJobs and uses Quartz to start them:

4) JobDriver- 定义几个HttpPollingJobs 并使用 Quartz 启动它们:

public class JobDriver {
    private List<HttpPollingJob> jobs;

    public JobDriver() {
        HttpPollingJob job1 = new HttpPollingJob("job-1", "http://www.example.com/1");
        HttpPollingJob job2 = new HttpPollingJob("job-2", "http://www.example.com/2");
        HttpPollingJob job3 = new HttpPollingJob("job-3", "http://www.example.com/3");

        jobs = new ArrayList<HttpPollingJob>();
        jobs.add(job1);
        jobs.add(job2);
        jobs.add(job3);
    }

    public static void main(String[] args) {
    JobDriver driver = new JobDriver();
        driver.startJobs();
    }

    private void startJobs() {
        try {
            // Obtain a basic SchedulerFactory and fire it up.
            SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
            Scheduler scheduler = schedulerFactory.getScheduler();
            scheduler.start();

            // Define a job for every declared monitor.
            JobBuilder jobBuilder = null;

            for(ScheduledJob job : jobs) {

            Trigger trigger = job.getTrigger();
            jobBuilder = JobBuilder.newJob(job.getClass());

            // Bind the current job to this trigger.
            scheduler.scheduleJob(jobBuilder.build(), trigger);

            // TODO: Shut the scheduler down politely?!?!
        }
        catch(Throwable exc) {
            logger.error(exc.getMessage());

            // Force application to kick out.
            throw new RuntimeException(exc);
        }
    }
}

When I run this code I get a perfect startup with no errors or runtime exceptions. If I sprinkle System.out.printlnstatements I can see every single line of code executing flawlessly. The only problem is, once the program is running, its not printing the "Job fired!" message indicating that the polling job is kicking off.

当我运行这段代码时,我得到了一个完美的启动,没有错误或运行时异常。如果我撒上System.out.println语句,我可以看到每一行代码都完美地执行。唯一的问题是,一旦程序运行,它不会打印“作业被解雇!”消息,表明轮询作业正在开始。

I've tried every combination of start()and shutdown()I can think of to no avail. Can any Quartz mavens look at this code and tell me why the job isn't firing?

我试过的每个组合start()shutdown()我能想到的都无济于事。任何 Quartz 专家都可以看看这段代码并告诉我为什么这项工作没有被解雇吗?

In the logs (I configured log4j) I see the Quartz worker thread being created for the scheduled job. I feel like I'm 99% of the way there but am just missing something obvious. Thanks in advance!

在日志中(我配置了 log4j),我看到正在为计划作业创建 Quartz 工作线程。我觉得我已经完成了 99%,但只是遗漏了一些明显的东西。提前致谢!

采纳答案by IAmYourFaja

Its your constructors - the JobBuilderlooks for the no-args and since they're not defined it refuses to build the jobs. Add empty no-arg ctors and you're all set.

它是您的构造函数 -JobBuilder查找无参数,并且由于它们未定义,因此拒绝构建作业。添加空的 no-arg ctors 就可以了。

回答by mtariq

@4herpsand7derpsago yes you are right, you are 99% there, I ran your code and there is only one problem in it, the Default constructors are absent in HttpPollingJoband PollingJobclasses, For that reason Scheduler is not able to create their instances,

@ 4herpsand7derpsago是你的权利,你有99%的在那里,我跑你的代码,只有一个问题,它的默认构造函数在缺席HttpPollingJobPollingJob课程,为此计划不能够创造自己的情况下,

Simple Solution add following code in below classes
HttpPollingJobclass

简单的解决方案在下面的类
HttpPollingJob类中添加以下代码

public HttpPollingJob() {
}

PollingJobclass

PollingJob

public PollingJob() {
}

Bingo, the following messages will be printed

宾果游戏,将打印以下消息

Job fired!
Job fired!
Job fired!

Job fired!
Job fired!
Job fired!

If you want to repeat the trigger, add following code in PollingJob

如果要重复触发,在PollingJob中添加如下代码

protected final Trigger getDefaultTrigger() {
    TriggerBuilder<?> triggerBuilder = TriggerBuilder
            .newTrigger()
            .startNow()
            .withSchedule(
                    SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInMilliseconds(DEF_FREQUENCY).repeatForever());

    return triggerBuilder.build();
}

Hoping that now I will receive the bounty :)

希望现在我能收到赏金:)

BONUS
Seems like you want to poll or do something with urls, A better way to pass that using king JobDataMap

奖励
似乎您想对 url 进行轮询或做一些事情,使用 king 传递它的更好方法JobDataMap

Updated JobDriver

更新作业驱动程序

import java.util.ArrayList;
import java.util.List;

import org.quartz.JobBuilder;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.Trigger;

public class JobDriver {
private List<HttpPollingJob> jobs;

public JobDriver() {
    HttpPollingJob job1 = new HttpPollingJob("job-1",
            "http://www.example.com/1");
    HttpPollingJob job2 = new HttpPollingJob("job-2",
            "http://www.example.com/2");
    HttpPollingJob job3 = new HttpPollingJob("job-3",
            "http://www.example.com/3");

    jobs = new ArrayList<HttpPollingJob>();
    jobs.add(job1);
    jobs.add(job2);
    jobs.add(job3);
}

public static void main(String[] args) {
    JobDriver driver = new JobDriver();
    driver.startJobs();
}

private void startJobs() {
    try {
        // Obtain a basic SchedulerFactory and fire it up.
        SchedulerFactory schedulerFactory = new org.quartz.impl.StdSchedulerFactory();
        Scheduler scheduler = schedulerFactory.getScheduler();
        scheduler.start();
        // Define a job for every declared monitor.
        JobBuilder jobBuilder = null;

        for (HttpPollingJob job : jobs) {

            Trigger trigger = job.getTrigger();
            jobBuilder = JobBuilder.newJob(job.getClass());
            jobBuilder.usingJobData("name", job.getName());
            jobBuilder.usingJobData("url", job.getServerURL());

            // Bind the current job to this trigger.
            scheduler.scheduleJob(jobBuilder.build(), trigger);

            // TODO: Shut the scheduler down politely?!?!
        }


    } catch (Throwable exc) {
        // Force application to kick out.
        throw new RuntimeException(exc);
    }
}
}

updated HttpPollingJob

更新的HttpPollingJob

import java.util.Map;

import org.quartz.JobExecutionContext;

public class HttpPollingJob extends PollingJob {
private String serverURL;
private org.slf4j.Logger logger =
    org.slf4j.LoggerFactory.getLogger(HttpPollingJob.class);

public HttpPollingJob(final String nm, final String server) {
    super(nm);

    setServerURL(server);
}
public HttpPollingJob() {
}

public String getServerURL() {
    return serverURL;
}

public void setServerURL(final String server) {
    serverURL = server;
}

@Override
public final void poll(JobExecutionContext context) {

    try {
        Map dataMap = context.getJobDetail().getJobDataMap();
        String nm = (String)dataMap.get("name");
        String url = (String)dataMap.get("url");
        // This is where we would use HttpClient to connect to a web server and poll it.
        System.out.println("Job fired! name:"+nm+" url:"+url);
    }
    catch(Throwable thrown) {
        logger.error(thrown.getMessage());
    }
}
}

new output

新输出

Job fired! name:job-1 url:http://www.example.com/1
Job fired! name:job-2 url:http://www.example.com/2
Job fired! name:job-3 url:http://www.example.com/3

Job fired! name:job-1 url:http://www.example.com/1
Job fired! name:job-2 url:http://www.example.com/2
Job fired! name:job-3 url:http://www.example.com/3

回答by Andy

Apparently, you have not started the trigger. See Quartz Tutorialor Javadocs:

显然,您还没有启动触发器。请参阅Quartz 教程Javadocs

// Trigger the job to run now, and then every 40 seconds
  Trigger trigger = newTrigger()
      .withIdentity("myTrigger", "group1")
      .startNow()
      .withSchedule(simpleSchedule()
          .withIntervalInSeconds(40)
          .repeatForever())            
      .build();

回答by Ahmed Hashem

Could you try to change the code of the method getDefaultTriggerin the class PollingJobinto the following :

您能否尝试getDefaultTrigger将类中方法的代码更改PollingJob为以下内容:

    protected final Trigger getDefaultTrigger()  {

return TriggerBuilder.newTrigger()
         .withSchedule(SimpleScheduleBuilder.simpleSchedule()
        .withIntervalInMilliseconds(DEF_FREQUENCY))
        .startAt(DateBuilder.futureDate(1,  DateBuilder.IntervalUnit.SECOND))
        .build();
}

回答by Aham Brahmasmi

i feel some issue with the way you create the trigger. Remember you cannot reuse trigger for multiple jobs

我觉得你创建触发器的方式有问题。请记住,您不能为多个作业重用触发器

Try creating trigger with unique identity and group like below

尝试创建具有唯一标识和组的触发器,如下所示

Trigger everyHourTrigger = newTrigger().withIdentity("everyWeeklyTrigger", "group1") .startNow().withSchedule(cronSchedule("0 1 * * * ?")).build();

触发everyHourTrigger = newTrigger().withIdentity("everyWeeklyTrigger", "group1") .startNow().withSchedule(cronSchedule("0 1 * * * ?")).build();