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
Quartz Jobs Not Kicking Off
提问by IAmYourFaja
Edit: I am using quartz-2.1.5.jar
. Here's the summary of my classes:
编辑:我正在使用quartz-2.1.5.jar
. 以下是我的课程总结:
HttpPollingJob
extendsPollingJob
extendsScheduledJob
implementsorg.quartz.Job
HttpPollingJob
扩展PollingJob
扩展ScheduledJob
工具org.quartz.Job
Specifically:
具体来说:
1) ScheduledJob
implements Quartz Job
(abstract base class for all my Job
types):
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) PollingJob
extends 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) HttpPollingJob
extends 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 HttpPollingJob
s and uses Quartz to start them:
4) JobDriver
- 定义几个HttpPollingJob
s 并使用 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.println
statements 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 JobBuilder
looks 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 HttpPollingJob
and PollingJob
classes, For that reason Scheduler is not able to create their instances,
@ 4herpsand7derpsago是你的权利,你有99%的在那里,我跑你的代码,只有一个问题,它的默认构造函数在缺席HttpPollingJob
和PollingJob
课程,为此计划不能够创造自己的情况下,
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 getDefaultTrigger
in the class PollingJob
into 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();