据说 quartz 2 以下的与 2.* 版本的配置不一样, 在此就忽略了, 反正我又不去用, 哈哈
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.1.6.RELEASE</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>4.1.6.RELEASE</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.1.6.RELEASE</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.apache.servicemix.bundles</groupId> <artifactId>org.apache.servicemix.bundles.spring-context-support</artifactId> <version>4.0.7.RELEASE_3</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.1.7</version> <scope>runtime</scope> </dependency>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="autoStartup" value="true" /> <property name="triggers"> <list> <ref bean="appSchedulerTrigger" /> </list> </property> </bean> <!-- http://www.oschina.net/question/8676_9032 --> <!-- http://my.oschina.net/jeffli1993/blog/265785 --> <!-- http://www.quartz-scheduler.org/ --> <!-- 定时触发器 --> <bean id="appSchedulerTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!-- 表达式的格式:秒 分 时 日 月 周 年(可选) --> <!-- 每天 23 点执行一次 --> <!-- <property name="cronExpression" value="0 0 23 * * ?" /> --> <!-- 每隔 1 小时执行一次, 之前的 秒 与 分 必需设置为 0 , 不然会执行 60minutes X 60seconds = 3600 次的, 别问我是怎么知道的 --> <property name="cronExpression" value="0 0 */1 * * ?" /> <property name="jobDetail" ref="appJobDetail" /> </bean> <bean id="appJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 是否允许任务并发执行 当值为false时 表示必须等到前一个线程处理完毕后才再启一个新的线程 --> <property name="concurrent" value="false" /> <property name="targetObject" ref="syncIMUserJob" /> <property name="targetMethod" value="doSync" /> </bean> <!-- 同步 IM User 任务 --> <bean id="syncIMUserJob" class="***.quartz.job.SyncIMUserJob" />
SyncIMUserJob 就是一个普通的 java 类
/** * */ package ***.quartz.job; /** * @author Colin * */ public class SyncIMUserJob { private Logger logger; /** * */ public SyncIMUserJob() { logger = Logger.getLogger( SyncIMUserJob.class ); } public void doSync() { StackTraceElement trace = Thread.currentThread().getStackTrace()[ 1 ]; logger.info( "log4j " + " --- " + trace.getClassName() + " - " + trace.getMethodName() ); } }
日志开启到 trace 级别后看到 SchedulerFactoryBean 每隔 几秒 会去触发 triggers 中对应的 触发器, 然后 triggers 会根据定义的触发规则 cronExpression 去通过 MethodInvokingJobDetailFactoryBean 反射生成 targetObject 的 targetMethod 的 Method 对象, 并调用执行.