0

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.

  • 1
    Your CronJob is not a spring bean so dao can't be autowired. Try to add `@Component` to the CronJob class – StanislavL May 26 '17 at 09:45
  • It didn't work, I even added it to servlet-context for component scan the output is still java.lang.NullPointerException –  May 26 '17 at 11:35

1 Answers1

0

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/