如何以编程方式创建触发器对象?
我正在使用 Springquartz Scheduler,但我没有使用 XML 文件。我想以编程方式创建整个配置。
我编写了以下代码。
package com.eaportal.service.impl;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.quartz.JobDetail;
import org.springframework.scheduling.SchedulingException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.eaportal.service.intfc.AuctionWinnerService;
public class NormalAuctionWinnerServiceImpl1 implements AuctionWinnerService {
@SuppressWarnings("deprecation")
public void declareWinner(int auctionId, Map<String, Object> parameterMap) {
System.out.println("INSIDE DECLARE WINNER METHOD.");
/** STEP 1 : INSTANTIATE TASK CLASS **/
NormalAuctionWinnerTask1 runMeTask = new NormalAuctionWinnerTask1();
System.out.println("FINISHED STEP 1");
/** STEP 2 : INSTANTIATE JOB DETAIL CLASS AND SET ITS PROPERTIES **/
Map<String,Object> jobDataAsMap = new HashMap<String,Object>();
jobDataAsMap.put("runMeTask",runMeTask);
JobDetailBean jdb = new JobDetailBean();
jdb.setJobClass(NormalAuctionWinnerTask1.class);
jdb.setJobDataAsMap(jobDataAsMap);
System.out.println("FINISHED STEP 2");
/** STEP 3 : INSTANTIATE CRON TRIGGER AND SET ITS PROPERTIES **/
CronTriggerBean ctb = new CronTriggerBean();
Date d1 = new Date();
Date d2 = new Date();
d2.setMinutes(d1.getMinutes()+10);
ctb.setStartTime(d1);
ctb.setEndTime(d2);
ctb.setJobDetail(jdb);
try {
ctb.setCronExpression("59 * * * * ? *");
} catch (ParseException e) {
e.printStackTrace();
}
/** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/
SchedulerFactoryBean sfb = new SchedulerFactoryBean();
sfb.setJobDetails(new JobDetail[]{jdb});
try {
sfb.start();
} catch (SchedulingException e) {
e.printStackTrace();
}
}
}
该代码正在工作,只是触发器没有触发,因为我还没有设置它。
这里的问题是在 XML 配置中,我们有 SchedulerFactoryBean 的“triggers”属性,并且我们使用列表来配置触发器。
但我无法以编程方式设置相同的属性。 SchedulerFactoryBean中有一个setTriggers方法,它接受一个Trigger数组 但如何创建它是问题。
我在过去的 4 个小时里仍然没有成功的迹象。
有人可以帮我吗?
谢谢
I am using Spring quartz Scheduler but I am not using an XML file. I want to create the entire configuration programmatically.
I have written the following code.
package com.eaportal.service.impl;
import java.text.ParseException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.quartz.JobDetail;
import org.springframework.scheduling.SchedulingException;
import org.springframework.scheduling.quartz.CronTriggerBean;
import org.springframework.scheduling.quartz.JobDetailBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
import com.eaportal.service.intfc.AuctionWinnerService;
public class NormalAuctionWinnerServiceImpl1 implements AuctionWinnerService {
@SuppressWarnings("deprecation")
public void declareWinner(int auctionId, Map<String, Object> parameterMap) {
System.out.println("INSIDE DECLARE WINNER METHOD.");
/** STEP 1 : INSTANTIATE TASK CLASS **/
NormalAuctionWinnerTask1 runMeTask = new NormalAuctionWinnerTask1();
System.out.println("FINISHED STEP 1");
/** STEP 2 : INSTANTIATE JOB DETAIL CLASS AND SET ITS PROPERTIES **/
Map<String,Object> jobDataAsMap = new HashMap<String,Object>();
jobDataAsMap.put("runMeTask",runMeTask);
JobDetailBean jdb = new JobDetailBean();
jdb.setJobClass(NormalAuctionWinnerTask1.class);
jdb.setJobDataAsMap(jobDataAsMap);
System.out.println("FINISHED STEP 2");
/** STEP 3 : INSTANTIATE CRON TRIGGER AND SET ITS PROPERTIES **/
CronTriggerBean ctb = new CronTriggerBean();
Date d1 = new Date();
Date d2 = new Date();
d2.setMinutes(d1.getMinutes()+10);
ctb.setStartTime(d1);
ctb.setEndTime(d2);
ctb.setJobDetail(jdb);
try {
ctb.setCronExpression("59 * * * * ? *");
} catch (ParseException e) {
e.printStackTrace();
}
/** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/
SchedulerFactoryBean sfb = new SchedulerFactoryBean();
sfb.setJobDetails(new JobDetail[]{jdb});
try {
sfb.start();
} catch (SchedulingException e) {
e.printStackTrace();
}
}
}
The code is working except the trigger doesn't fire coz I haven't set it.
Here the problem is in XML configuration we have 'triggers' property of schedulerFactoryBean and we use list to configure our triggers.
But I am not able to set the same property programmatically.
There is a setTriggers method in SchedulerFactoryBean that accepts an array of Trigger
but how to create it is the problem.
I am on it for the last 4 hrs still no sign of success.
Can someone help me here?
Thanks
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我能够使用 Spring Scheduling Framework 成功地做到这一点。
我知道这是一篇非常古老的文章,但由于该主题的内容非常稀缺,因此将其放在这里应该是一个更好的主意。
第一篇文章代码中的主要问题是
afterPropertiesSet()
尚未在JobDetail
对象以及CronTrigger
上调用代码>对象。 afterProperties 函数在 cron 准备运行之前对输入的值进行一些处理。另外,我使用了 MethodInvokingJobDetailFactoryBean 而不是常规的 jobDetail 对象,因为它为我在给定类中由 cron 调用的函数提供了更大的灵活性。
这是我的代码:
afterProperties()
很重要,可以从SchedulerFactoryBean
的afterProperties
实现来理解,如下所示:请注意,所有此类任务(例如获取调度程序和使用触发器注册作业)都是作为此函数的一部分完成的。
I was able to do this with Spring Scheduling Framework successfully.
I understand this is a very old post but as the content on this topic is pretty scarce, it should be a better idea to put it here.
The major problem in the code for the first post is that the
afterPropertiesSet()
hasn't been invoked on both theJobDetail
object as well as theCronTrigger
object. TheafterProperties
function does some processing on the entered values before the cron is ready to be run.Also, I have used the
MethodInvokingJobDetailFactoryBean
instead of the regularjobDetail
object as it gives me more flexibility on the function to be called by the cron in the given class.Here is my code:
afterProperties()
is important and it can be understood from theafterProperties
implementation ofSchedulerFactoryBean
which is as follows:As you may notice, all such tasks as getting the scheduler and registering the job with the triggers is done as a part of this function.
主要问题应该是,您需要安排作业:
我不知道 Spring Quarz Beans 的情况如何,但正常的 Quarz 作业和触发器必须有一个名称和一个组!您可能需要启动调度程序:
scheduler.start();
我对您的代码进行了一些修改,使其无需 spring 即可工作,并且全部省略了不需要的内容,以演示它是如何实现的工作原理:
封装测试;
The main problem should be, that you need to schedule the job:
And I do not know how it is for Spring Quarz Beans, but normal Quarz Jobs and Trigger must have a name and a group! And may you need to start the scheduler:
scheduler.start();
I have modified your code a bit that it works without spring, and all leave out the stuff that is not needed, to demonstrate how it works:
package test;