java - Quartz Scheduler not triggering the job when configured via Spring 4 -


ive being sometime trying setup little program uses spring , quartz schedule task. followed other similar answers no luck. @ moment think have configured correctly, see no more exceptions job looks not kicking off.

in log.out spring generates, see following messages @ end:

2015-06-04t15:46:57.928 debug [org.springframework.core.env.propertysourcespropertyresolver] searching key 'spring.livebeansview.mbeandomain' in [systemproperties] 2015-06-04t15:46:57.929 debug [org.springframework.core.env.propertysourcespropertyresolver] searching key 'spring.livebeansview.mbeandomain' in [systemenvironment] 2015-06-04t15:46:57.929 debug [org.springframework.core.env.propertysourcespropertyresolver] not find key 'spring.livebeansview.mbeandomain' in property source. returning [null]

i show codes...

this class start scheduler:

public class jobrunner {      public static void main(string[] args) throws schedulerexception {         applicationcontext applicationcontext = new annotationconfigapplicationcontext(whatsthetimeconfiguration.class);         autowiringspringbeanjobfactory autowiringspringbeanjobfactory = new autowiringspringbeanjobfactory();         autowiringspringbeanjobfactory.setapplicationcontext(applicationcontext);          springbeanjobfactory springbeanjobfactory = new springbeanjobfactory();          schedulerfactorybean schedulerfactorybean = new schedulerfactorybean();         schedulerfactorybean.settriggers(trigger());         schedulerfactorybean.setjobfactory(springbeanjobfactory);         schedulerfactorybean.start();     }      private static simpletrigger trigger() {         return newtrigger()                 .withidentity("whatsthetimejobtrigger", "jobsgroup1")                 .startnow()                 .withschedule(simpleschedule()                         .withintervalinseconds(1)                         .repeatforever())                 .build();     }  } 

i want mention if use method schedulerfactorybean.getscheduler().start(), throws me null pointer exception on scheduler, thats why im calling start() on factory.

the class autowiringspringbeanjobfactory copy pasted answer here in stackoverflow. decided since other answers found configuration done via xml , don't want use xml.

public final class autowiringspringbeanjobfactory extends springbeanjobfactory implements         applicationcontextaware {      private transient autowirecapablebeanfactory beanfactory;      @override     public void setapplicationcontext(final applicationcontext context) {         beanfactory = context.getautowirecapablebeanfactory();     }      @override     protected object createjobinstance(final triggerfiredbundle bundle) throws exception {         final object job = super.createjobinstance(bundle);         beanfactory.autowirebean(job);         return job;     } } 

this class represents job want trigger:

@component public class whatsthetimemanager extends quartzjobbean {      @autowired     private whatsthetime usecase;     @autowired     private locationretriever locationdataprovider;      public whatsthetimemanager() {     }      @override     protected void executeinternal(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception {         usecase.tellmewhatsthetimein(locationdataprovider.alllocations());     }      public void setusecase(whatsthetime usecase) {         this.usecase = usecase;     }      public void setlocationdataprovider(locationretriever locationdataprovider) {         this.locationdataprovider = locationdataprovider;     } } 

my spring configuration doing component scanning, simple:

@configuration @componentscan(basepackages = "com.springpractice") public class whatsthetimeconfiguration {  } 

from point have interfaces, components , domain object, paste them also, in case forgot something:

public interface locationretriever {     list<string> alllocations(); } 

public interface timeoutputrenderer {     timereport renderreport(string timeinlocation, string location); } 

public interface timeretriever {     string timefor(string location); } 

@component public class locationretrieverdataprovider implements locationretriever{      public locationretrieverdataprovider() {     }      @override     public list<string> alllocations() {         return aslist("europe/london", "europe/madrid", "europe/moscow", "asia/tokyo", "australia/melbourne", "america/new_york");     } } 

@component public class timeoutputrendererdataprovider implements timeoutputrenderer {      public timeoutputrendererdataprovider() {     }      @override     public timereport renderreport(string location, string time) {         system.out.println(location + " time " + time);         return new timereport(location, time);     } } 

@component public class timeretrieverdataprovider implements timeretriever {      public timeretrieverdataprovider() {     }      @override     public string timefor(string location) {         simpledateformat timeinlocation = new simpledateformat("dd-m-yyyy hh:mm:ss a");         timeinlocation.settimezone(timezone.gettimezone(location));         return timeinlocation.format(new date());     } } 

just 1 last detail, maybe of interest. versions using in libraries following:

quartz 2.2.1

spring 4.1.6.release

when run appliaction, expect times of countries printed every second, doesn't happen.

if want clone code , try , see, can find @ git repo(feel free fork if want): https://github.com/sfrj/cleanarchitecture

the main error in code you're not letting spring handle scheduling you.

while can use quartz in code other code, idea of integration spring tell spring work want done , let spring hard work you.

in order allow spring run quartz scheduling, need declare job, jobdetail , trigger beans.

spring handles beans if created through spring life-cycle (i.e. using annotations or xml) not if objects created in code new statement.

the following code needs removed jobrunner.java:

springbeanjobfactory springbeanjobfactory = new springbeanjobfactory();  schedulerfactorybean schedulerfactorybean = new schedulerfactorybean(); schedulerfactorybean.settriggers(trigger()); schedulerfactorybean.setjobfactory(springbeanjobfactory); schedulerfactorybean.start(); ... private static simpletrigger trigger() {     return newtrigger()             .withidentity("whatsthetimejobtrigger", "jobsgroup1")             .startnow()             .withschedule(simpleschedule()                     .withintervalinseconds(1)                     .repeatforever())             .build(); } 

that code have re-written whatsthetimeconfiguration.java, , here's how looks now:

@configuration @componentscan(basepackages = "com.djordje.cleanarchitecture") public class whatsthetimeconfiguration {      @bean     public schedulerfactorybean schedulerfactorybean() {         schedulerfactorybean schedulerfactorybean = new schedulerfactorybean();         schedulerfactorybean.settriggers(trigger());         schedulerfactorybean.setjobdetails(jobdetail());         schedulerfactorybean.setjobfactory(springbeanjobfactory());         return schedulerfactorybean;     }      @bean     public springbeanjobfactory springbeanjobfactory() {         return new autowiringspringbeanjobfactory();     }      @bean     public jobdetail jobdetail() {         jobdetailimpl jobdetail = new jobdetailimpl();         jobdetail.setkey(new jobkey("whatsthetime"));         jobdetail.setjobclass(whatsthetimemanager.class);         jobdetail.setdurability(true);         return jobdetail;     }      @bean     public simpletrigger trigger() {         return newtrigger()                 .forjob(jobdetail())                 .withidentity("whatsthetimejobtrigger", "jobsgroup1")                 .startnow()                 .withschedule(simpleschedule()                         .withintervalinseconds(1)                         .repeatforever())                 .build();     } } 

schedulerfactorybean bean , handled , initialized spring, , simpletrigger , autowiringspringbeanjobfactory.

i added missing jobdetail class missing , added necessary wiring simpletrigger , schedulerfactorybean. both need know jobdetail place knows class job class needs triggered.


Comments

Popular posts from this blog

Magento/PHP - Get phones on all members in a customer group -

php - .htaccess mod_rewrite for dynamic url which has domain names -

Website Login Issue developed in magento -