/******************************************************************************* * Copyright (c) 2005, 2014 springside.github.io * * Licensed under the Apache License, Version 2.0 (the "License"); *******************************************************************************/ package org.springside.examples.showcase.demos.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.service.AccountService; /** * 被Spring的Quartz JobDetailBean定时执行的Job类, 支持持久化到数据库实现Quartz集群. * * 因为需要被持久化, 不能有用XXService等不能被持久化的成员变量, * 只能在每次调度时从QuartzJobBean注入的applicationContext中动态取出. * * @author calvin */ public class QuartzClusterableJob extends QuartzJobBean { private static Logger logger = LoggerFactory .getLogger(QuartzClusterableJob.class.getName() + ".quartz cluster job"); private ApplicationContext applicationContext; /** * 从SchedulerFactoryBean注入的applicationContext. */ public void setApplicationContext(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } /** * 定时打印当前用户数到日志. */ @Override protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException { AccountService accountService = applicationContext.getBean(AccountService.class); Map config = (Map) applicationContext.getBean("timerJobConfig"); long userCount = accountService.getUserCount(); String nodeName = (String) config.get("nodeName"); logger.info("There are {} user in database, on node {}.", userCount, nodeName); } }