最近发现一个更好的配置定时器的方法, 废话不多说,开搞:
1. 导入 jar 包,这里使用的 quartz 包是 spring 的所以无需引入其他 jar
2. 在你的配置文件目录下 创建一个 xml 文件
下面就是代码:
⑴定义触发器管理器 我是这么叫
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- <property name="startupDelay" value="180"/> 启动服务器后延迟启动定时任务 -->
<property name="triggers">
<list>
<ref bean="trigger1" />
<ref bean="trigger2" />
<ref bean="trigger3" />
<ref bean="trigger4" />
</list>
</property>
<property name="autoStartup" value="true" /><!--这里配置自动启动-->
</bean>
⑵注册 triggerbean
<!-- 绑定 begin -->
<bean id="trigger1" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="jobDetail2" />
<property name="cronExpression" value="*/10 * * * * ?" /><!-- 每隔10秒钟触发一次 -->
</bean>
⑶定义具体的 jobDetail
<bean id="sc_timerJobDetail2"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref=job1Class" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
<!-- 是否允许任务并发执行。当值为false时,表示必须等到前一个线程处理完毕后才再启一个新的线程 -->
</bean>
⑷定义具体的 Job 类 这个类是咱们自己写的 就是上面的 job1Class
job1ClassProperty 就是这个类的成员属性啦
<bean id="job1Class"
class="xyz.spacexplore.Job1Class">
<property name="job1ClassProperty" ref="job1ClassProperty"></property>
</bean>
===========================================
现在看下各个引用到的 spring 的类,主要看他们的一些成员属性:
SchedulerFactoryBean:
private Class<? extends SchedulerFactory> schedulerFactoryClass = StdSchedulerFactory.class;
private String schedulerName;
private Resource configLocation;//也是配置文件位置
private Properties quartzProperties;//quartz的配置文件 这个没用过
private Executor taskExecutor;
private DataSource dataSource;
private DataSource nonTransactionalDataSource;
private Map<String, ?> schedulerContextMap;
private ApplicationContext applicationContext;//上下文对象
private String applicationContextSchedulerContextKey;
private JobFactory jobFactory;
private boolean jobFactorySet = false;
private boolean autoStartup = true;//是否自动启动
private int startupDelay = 0;//设置延迟启动时长
private int phase = Integer.MAX_VALUE;
private boolean exposeSchedulerInRepository = false;
private boolean waitForJobsToCompleteOnShutdown = false;
private Scheduler scheduler;
CronTriggerBean
private static final Constants constants = new Constants(CronTrigger.class);
private JobDetail jobDetail;//这个就不用说了
private String beanName;//更不用说了
private long startDelay = 0;//也是延迟启动
MethodInvokingJobDetailFactoryBean:
private static Class<?> jobDetailImplClass;//job的具体实现类
private static Method setResultMethod;
private String name;
private String group = Scheduler.DEFAULT_GROUP;
private boolean concurrent = true;
private String targetBeanName;
private String[] jobListenerNames;
private String beanName;
private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();
private BeanFactory beanFactory;
private JobDetail jobDetail;
//静态成员类
public static class MethodInvokingJob extends QuartzJobBean