null entityManager in Quartz job
ssarver Jul 19, 2011 4:44 PMWhen the QuartzInitializer starts, the entityManager is not null.
When the HelloJob executes, the entityManager is null.
Also, the instance of org.jboss.logging.Logger does not work inside HelloJob.
How can I get a valid handle to entityManager inside HelloJob?
Why exactly is it failing? Is it because the job is retrieved from the database when it is run
by the quartz scheduler? In Seam 2, using @In EntityManager entityManager worked.
@Singleton
@Startup
public class QuartzInitializer {
@PersistenceContext
private EntityManager entityManager;
@Inject
private Logger log;
public QuartzInitializer() {
}
@PostConstruct
public void init() throws Exception {
startScheduler();
createJob();
}
public void startScheduler() throws Exception {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("seam.quartz.properties");
StdSchedulerFactory sf = new StdSchedulerFactory();
sf.initialize(is);
sched = sf.getScheduler();
sched.start();
}
public void createJob() throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler("QuartzScheduler00");
Date runTime = evenMinuteDate(new Date());
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run on the next round minute
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startAt(runTime)
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
log.info(job.getKey() + " will run at: " + runTime);
}
}
####################################################
public class HelloJob implements Job {
@Inject
private Logger log;
@PersistenceContext
private EntityManager entityManager;
public HelloJob() {
}
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
System.out.println("***Hello World! job: " + context.getJobDetail().getKey() + " executed at " + new Date());
// Reschedule job to run a minute later
Scheduler scheduler = context.getScheduler();
Trigger t = context.getTrigger();
SimpleTriggerImpl timpl = (SimpleTriggerImpl)t;
Date runTime = evenMinuteDate(new Date());
timpl.setNextFireTime(runTime);
Trigger trigger = newTrigger()
.withIdentity("trigger999", "group1")
.startAt(runTime)
.build();
scheduler.rescheduleJob(t.getKey(), trigger);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
#########################################################
# seam.quartz.properties
org.quartz.scheduler.instanceName = QuartzScheduler00
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.dataSource = QUARTZ
org.quartz.dataSource.QUARTZ.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.QUARTZ.URL = jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.QUARTZ.user = XXXXXXXXXX
org.quartz.dataSource.QUARTZ.password = XXXXXXXXXX
org.quartz.dataSource.QUARTZ.maxConnections = 5
When the HelloJob executes, the entityManager is null.
Also, the instance of org.jboss.logging.Logger does not work inside HelloJob.
How can I get a valid handle to entityManager inside HelloJob?
Why exactly is it failing? Is it because the job is retrieved from the database when it is run
by the quartz scheduler? In Seam 2, using @In EntityManager entityManager worked.
@Singleton
@Startup
public class QuartzInitializer {
@PersistenceContext
private EntityManager entityManager;
@Inject
private Logger log;
public QuartzInitializer() {
}
@PostConstruct
public void init() throws Exception {
startScheduler();
createJob();
}
public void startScheduler() throws Exception {
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("seam.quartz.properties");
StdSchedulerFactory sf = new StdSchedulerFactory();
sf.initialize(is);
sched = sf.getScheduler();
sched.start();
}
public void createJob() throws Exception {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler("QuartzScheduler00");
Date runTime = evenMinuteDate(new Date());
// define the job and tie it to our HelloJob class
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run on the next round minute
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startAt(runTime)
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
log.info(job.getKey() + " will run at: " + runTime);
}
}
####################################################
public class HelloJob implements Job {
@Inject
private Logger log;
@PersistenceContext
private EntityManager entityManager;
public HelloJob() {
}
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
System.out.println("***Hello World! job: " + context.getJobDetail().getKey() + " executed at " + new Date());
// Reschedule job to run a minute later
Scheduler scheduler = context.getScheduler();
Trigger t = context.getTrigger();
SimpleTriggerImpl timpl = (SimpleTriggerImpl)t;
Date runTime = evenMinuteDate(new Date());
timpl.setNextFireTime(runTime);
Trigger trigger = newTrigger()
.withIdentity("trigger999", "group1")
.startAt(runTime)
.build();
scheduler.rescheduleJob(t.getKey(), trigger);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
#########################################################
# seam.quartz.properties
org.quartz.scheduler.instanceName = QuartzScheduler00
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 5
org.quartz.threadPool.threadPriority = 5
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = false
org.quartz.jobStore.dataSource = QUARTZ
org.quartz.dataSource.QUARTZ.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.QUARTZ.URL = jdbc:mysql://localhost:3306/quartz
org.quartz.dataSource.QUARTZ.user = XXXXXXXXXX
org.quartz.dataSource.QUARTZ.password = XXXXXXXXXX
org.quartz.dataSource.QUARTZ.maxConnections = 5