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
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;
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.