先来看配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- Spring提供一个叫作JobDetailBean
的类让JobDetail
能对一些有意义的初始值进行初始化-->
<bean id="sayHelloJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass">
<value>test.timerTask.SayHelloTaskUsingQuartz</value>
</property>
</bean>
<!-- 关键在如下两个触发器的配置 -->
<!-- 类似于Java的简单触发器 -->
<bean id="helloTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail">
<ref bean="sayHelloJob"/>
</property>
<property name="startDelay">
<value>1000</value>
</property>
<property name="repeatInterval">
<value>3000</value>
</property>
</bean>
<!-- 复杂触发器 -->
<bean id="helloCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<ref bean="sayHelloJob"/>
</property>
<property name="cronExpression">
<!-- 关键在配置此表达式 -->
<value>0 49 15 * * ?</value>
</property>
</bean>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<ref bean="helloCronTrigger"/>
</property>
</bean>
下面是具体的逻辑操作的类
public class SyncDate extends QuartzJobBean {
private static int code = 0;
@Override
protected void executeInternal(JobExecutionContext context)
throws JobExecutionException {
JobDataMap mergedJobDataMap = context.getMergedJobDataMap();
ApplicationContext application = (ApplicationContext) mergedJobDataMap
.get("applicationContext");//获取ApplicationContext 的引用。
SearchService searchSMXService = (SearchService) application.getBean("searchSMXService");
}
}
最早用的是获取bean的方式是用ClassPathXmlApplicationContext;
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"/conf/spring/applicationContext*.xml");
SearchService searchSMXService = (SearchService) ctx.getBean("searchSMXService");
后来发现因为系统中不止一个地方进行初始化配置文件,所以定时器会执行多次(初始化几次就执行几次)
所以改为上面那种方式获取bean,不过这种要在spring配置文件里面注入一下applicationContextJobDataKey
即:
<bean id="smxJob" class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="applicationContextJobDataKey" value="applicationContext"></property>
<property name="jobClass">
<value>cn.com.nuoter.playbar.newSMX.util.SyncDate</value>
</property>
</bean>