javaspringquartzdata-access-object

Using DAO classes for data call in Cron Job


Hi this is my Cron Scheduler

public class CronListener implements ServletContextListener {

Scheduler scheduler = null;

@Override
public void contextInitialized(ServletContextEvent servletContext) {
    System.out.println("Context Initialized");

    try {
        // Setup the Job class and the Job group
        JobDetail job = newJob(CronJob.class).withIdentity("CronQuartzJob",
                "Webapp").build();

         // This is what I've tried as well
        /* 
         * JobDataMap jdm = new JobDataMap(); jdm.put("targetDAO",
         * targetDAO);
         */

        // Create a Trigger that fires every X minutes.
        Trigger trigger = newTrigger()
                .withIdentity("CronQuartzJob", "Sauver")
                .withSchedule(
                        CronScheduleBuilder.cronSchedule
         ("0 0/1 * 1/1 * ? *")).build();


        // Setup the Job and Trigger with Scheduler & schedule jobs
        scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    } catch (SchedulerException e) {
        e.printStackTrace();
    }
}

@Override
public void contextDestroyed(ServletContextEvent servletContext) {
    System.out.println("Context Destroyed");
    try {
        scheduler.shutdown();
    } catch (SchedulerException e) {
        e.printStackTrace();
    }
}

}

And here's the Cron Job itself

public class CronJob implements org.quartz.Job {

static Logger log = Logger.getLogger(CronJob.class.getName());

@Autowired
TargetDAO targetDAO;

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

    try {
        targetDAO.getAllTargets();
    } catch (Exception e1) {
        e1.printStackTrace();
    }

    log.info("webapp-rest cron job started");
    try {
        Utils.getProcessed();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

What I'm trying to do is getting a DAO class to call some data into it and call a function through it, every few hours. But when I call data through the DAO, it always returns empty.

What I've found is that I must map the DAO somehow, I've seen in xml-based cron jobs, but I am unable to map it in this one.


Solution

  • This not exactly an answer, but a workaround, What I did was made a new class

    @EnableScheduling
    @Component
    public class SpringCronJob {
    
    private static Logger log = Logger.getLogger(SpringCronJob.class.getName());
    
    @Autowired
    TargetDAO targetDAO;
    
    @Scheduled(fixedRate = 15000)
    public void getPostedTargets() {
          try {
              log.info(targetDAO.getAllTargets());
          } catch (Exception e) {
                // TODO Auto-generated catch block
              e.printStackTrace();
          }
      }
    }
    

    It doesn't need anything else, no scheduler, you just need to add it to your component scan

    This is what lead me to it http://howtodoinjava.com/spring/spring-core/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/