spring4 quartz2 定时执行

    据说 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 对象, 并调用执行.   

猜你喜欢

转载自colin-davis.iteye.com/blog/2245535