package org.springside.examples.showcase.schedule; import java.util.Map; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.QuartzJobBean; import org.springside.examples.showcase.common.service.AccountManager; /** * 被Spring的Quartz JobDetailBean定时执行的Job类, 支持持久化到数据库实现Quartz集群. * * 因为需要被持久化, 不能有用XXManager等不能被持久化的成员变量, * 只能在每次调度时从QuartzJobBean注入的applicationContext中动态取出. */ public class QuartzClusterableJob extends QuartzJobBean { private static Logger logger = LoggerFactory.getLogger(QuartzClusterableJob.class); private ApplicationContext applicationContext; /** * 从SchedulerFactoryBean注入的applicationContext. */ public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } /** * 定时打印当前用户数到日志. */ @SuppressWarnings("unchecked") @Override protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException { AccountManager accountManager = applicationContext.getBean(AccountManager.class); Map config = (Map) applicationContext.getBean("timerJobConfig"); long userCount = accountManager.getUserCount(); String nodeName = (String) config.get("nodeName"); logger.info("There are {} user in database, print by {}'s job.", userCount, nodeName); } }