Hi Angelo, It's been several months since I wrote this, so the details are fuzzy...but here are some snippets of some code that I'm currently running in production:
/* The following service is registered with Tapestry IOC. It schedules jobs via Quartz */ public class SchedulerServiceImpl implements SchedulerService { public class TapestryIocJobFactory implements JobFactory { ServiceResources _srvcRsrcs; Logger _logger; TapestryIocJobFactory( ServiceResources prmSrvcRsrcs, Logger prmLogger ) { _srvcRsrcs = prmSrvcRsrcs; _logger = prmLogger; } public Job newJob( TriggerFiredBundle prmTrgrFiredBndl ) { Class c = prmTrgrFiredBndl.getJobDetail().getJobClass(); return( (Job)_srvcRsrcs.getService( c ) ); } } public SchedulerServiceImpl( ServiceResources prmSrvcRsrcs, Logger prmLogger, SystemParameterService prmSystmPrmtrSrvc ) { try { SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); Scheduler sched = schedFact.getScheduler(); sched.setJobFactory( new TapestryIocJobFactory( prmSrvcRsrcs, prmLogger ) ); sched.start(); /* The first job to be registered: the job that * looks for newly-queued messages to send via smtp. */ JobDetail jobDetail = new JobDetail("sendMailJob", null, SendMailJob.class ); Trigger trigger = TriggerUtils.makeSecondlyTrigger( 10 ); trigger.setStartTime( new Date() ); trigger.setName( "sendMailTrigger" ); sched.scheduleJob(jobDetail, trigger); /* The second job to be registered: the job that * deletes any pending messages that were never * completed. */ jobDetail = new JobDetail("cleanPendingMailJob", null, CleanPendingMailJob.class ); trigger = TriggerUtils.makeDailyTrigger( 2, 3 ); trigger.setName( "cleanPendingMailTrigger" ); sched.scheduleJob(jobDetail, trigger); /* And so one and so forth, registering more jobs. */ } catch (SchedulerException e) { e.printStackTrace(); } } } The above service is registered in AppModule like this, to force it to load when the IOC registry starts up: binder.bind( SchedulerService.class, SchedulerServiceImpl.class ).eagerLoad(); Here's an example of one of the jobs registered above: public class SendMailJobImpl extends HENJob implements SendMailJob { final private MessageService _msgSrvc; /** * */ public SendMailJobImpl( Logger prmLogger, org.hibernate.Session prmSn, UserDAO prmUserDAO, MessageService prmMsgSrvc, SystemParameterService prmSystmPrmtrSrvc, PerthreadManager prmThrdMngr, HibernateSessionManager prmHbrntSnMngr ) { super( prmLogger, prmSn, prmUserDAO, prmSystmPrmtrSrvc, prmThrdMngr, prmHbrntSnMngr ); _msgSrvc = prmMsgSrvc; } @Override public void run() { /* Code to get a list of emails ready to send, and to send them via SMTP. */ } } And here's the parent of the above class...all of my quartz jobs are descendants of this class: public abstract class HENJob implements Job { private final Logger _logger; private final Session _sn; private final PerthreadManager _perThrdMngr; private final HibernateSessionManager _hbrntSnMngr; private JobDataMap _jobDataMap = null; public HENJob( Logger prmLogger, Session prmSn, PerthreadManager prmThrdMngr, HibernateSessionManager prmHbrntSnMngr ) { _logger = prmLogger; _sn = prmSn; _userDAO = prmUserDAO; _systmPrmtrSrvc = prmSystmPrmtrSrvc; _perThrdMngr = prmThrdMngr; _hbrntSnMngr = prmHbrntSnMngr; } public void execute(JobExecutionContext arg0) throws JobExecutionException { try { _jobDataMap = arg0.getMergedJobDataMap(); run(); _hbrntSnMngr.commit(); } finally { _perThrdMngr.cleanup(); } } protected abstract String getSystmPrmtrPrfx(); protected abstract void run(); public JobDataMap getJobDataMap() { return _jobDataMap; } public Logger getLogger() { return _logger; } public Session getSn() { return _sn; } } Good luck! Andy On Sat, 2008-10-11 at 02:40 -0700, Angelo Chen wrote: > Hi Andy, > > Any sample code for this? Thanks. > > Angelo > > > Andy Huhn wrote: > > > > Thanks, Howard...ServiceResources did the trick! > > > > On Sat, 2007-12-15 at 06:53 -0800, Howard Lewis Ship wrote: > >> The Registry is not exposed, a service may be passed its > >> ServiceResources via a constructor parameter. This is an extension of > >> ServiceLocator, which includes all the key methods of Registry, > >> allowing services to be obtained by type or by service id. > >> > >> In addition, starting in 5.0.7., service proxies are serializable, > >> which helps when integrating with Quartz. You can store a reference > >> to a service in a non-transient field of your Job. I did some Quartz > >> integration for a project using the 5.0.5 code, and it required > >> jumping through some serious hoops. > >> > >> In fact, that code code was an example of why I think you are going > >> down the wrong path. I had a JobRunner service that tooks mapped > >> contribution of ScheduledJobs; the ScheduledJob was a wrapper around > >> some scheduling information and a Runnable object. Dependencies were > >> injected into the contribute method(s) and packaged up as Runnable's > >> that are part of the configuration. The JobRunner was @EagerLoad. > >> > >> On Dec 14, 2007 9:22 PM, Andy Huhn <[EMAIL PROTECTED]> wrote: > >> > All, > >> > > >> > I'd like to use Quartz with tapestry. As such, I'd like to get a > >> > reference to the Registry and pass it into a Tapestry service (so that > >> I > >> > can use it in my Quartz jobs to instantiate all of my DAOs and > >> Hibernate > >> > Sessions). > >> > > >> > I saw some discussion here on the list a few days ago about the > >> > Registry...it sounds like it's not exposed to services at all. Is this > >> > true? Does anyone have any ideas how I can get a reference to it? > >> > > >> > I have also thought about building a completely new registry inside > >> this > >> > service for all of the quartz jobs to use, but my guess is that there > >> > would be quite an impact on the machine's resources. Does anyone have > >> a > >> > good feel for how much memory I can expect to give up if I instantiate > >> a > >> > second instance of the Registry? > >> > > >> > Thanks, > >> > Andy > >> > > >> > --------------------------------------------------------------------- > >> > To unsubscribe, e-mail: [EMAIL PROTECTED] > >> > For additional commands, e-mail: [EMAIL PROTECTED] > >> > > >> > > >> > >> > >> > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: [EMAIL PROTECTED] > > For additional commands, e-mail: [EMAIL PROTECTED] > > > > > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]