QuartzDispatcher and ClassNotFoundException
maheidt Feb 28, 2008 10:16 AMI have an issue with QuartzDispatcher and scheduleTimedEvent.
This is the error message:
21:16:01,118 ERROR [ErrorLogger] Job (DEFAULT.-6ad11a7d:1185c88089f:-7f8e threw an exception. org.quartz.SchedulerException: Job threw an unhandled exception. [See nested exception: org.jboss.seam.InstantiationException: Could not instantiate Seam component: danteUsersRetriever] at org.quartz.core.JobRunShell.run(JobRunShell.java:214) ... Caused by: javax.naming.CommunicationException [Root exception is java.lang.ClassNotFoundException: No ClassLoaders found for: org.domain.QuartzTest.session.DanteUsersRetriever (no security manager: RMI class loader disabled)]
It's reproducible very easily:
- AS 4.2.1, Seam 2.0.1.GA
- Create new seam project
- change components.xml:
<components ... xmlns:async="http://jboss.com/products/seam/async" ... xsi:schemaLocation= "...http://jboss.com/products/seam/async http://jboss.com/products/seam/async-2.0.xsd... > <async:quartz-dispatcher/>
- Add two classes
DanteUsersTimer.java
package org.domain.QuartzTest.session;
import org.jboss.annotation.ejb.Local;
@Local
public interface DanteUsersTimer {
public void start() throws Exception;
public void cancel();
public void stop();
}DanteUsersTimerBean.java
package org.domain.QuartzTest.session;
import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Destroy;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.Startup;
import org.jboss.seam.async.CronSchedule;
import org.jboss.seam.async.QuartzDispatcher;
import org.jboss.seam.async.QuartzTriggerHandle;
import org.jboss.seam.log.Log;
@Name("danteUsersTimer")
@Scope(ScopeType.APPLICATION)
@Startup
public class DanteUsersTimerBean implements DanteUsersTimer {
private static final String defaultTrigger = "1 * * * * ?"; //every minute
@Logger private Log log;
private QuartzTriggerHandle handle;
private String trigger = defaultTrigger;
@Observer("org.jboss.seam.postInitialization")
public void start() throws Exception{
setTrigger(defaultTrigger);
}
public void restoreDefault(){
setTrigger(defaultTrigger);
}
public void setTrigger(String trigger){
try{
QuartzTriggerHandle handle = QuartzDispatcher.instance().scheduleTimedEvent("retrieveDanteUsers",
new CronSchedule((Long) null, trigger));
if (this.handle != null)
this.handle.cancel();
this.handle = handle;
this.trigger = trigger;
}
catch (Exception e){
log.error("setTrigger(): #0", e, trigger);
}
}
public String getTrigger(){
return trigger;
}
public void cancel(){
try{
if (handle != null)
handle.cancel();
handle = null;
trigger = null;
}
catch (Exception e){
log.error("cancel(): #0", e, trigger);
}
}
@Destroy
public void stop(){
cancel();
}
}DanteUsersRetriever.java
package com.dai.dante_tscm.session.users;
import org.jboss.annotation.ejb.Local;
@Local
public interface DanteUsersRetriever {
public void retrieve();
}
DanteUsersRetrieverBean.java
package com.dai.dante_tscm.session.users;
import javax.ejb.Stateless;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Observer;
import org.jboss.seam.log.Log;
@Name("danteUsersRetriever")
@Stateless
public class DanteUsersRetrieverBean implements DanteUsersRetriever{
@Logger private Log log;
@Observer("retrieveDanteUsers")
public void retrieve() {
log.info("retrieve dante users");
}
}