昨天面试被人问到定时任务,当时理解成批处理了,现在想来不是很准确。但是接触到的定时任务这块也就批处理用到了。既然定时任务作为一个项目中比较重要的部分,那就拿出开研究一下。
入门:
1.jdk有API可以实现定时任务。
1)创建任务类,集成TimerTask接口,重写run()方法。要完成的任务就写到run中即可。
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("现在是北京时间:"+new Date());
}
}
2)创建main()方法测试。
我这里是实现每两秒间隔打印一次系统时间功能。
2.使用quartz实现定时任务。
1)导入相关依赖
这个破教程说话不说全,第二个不导入会导致继承QuartzJobBean时找不到这个类。
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>
2)编写task类方法,继承QuartzJobBean类,重写相关方法。
public class Job1 extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("现在是北京时间:"+new Date());
}
}
3)在配置文件中配置
<bean id="job1" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.scbg.quartzz.Job1"/>
<property name="jobDataAsMap">
<map>
<entry key="timeout" value="0"/>
</map>
</property>
</bean>
<!--Trigger配置启动参数-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="job1"/>
<property name="startDelay" value="0"/>
<property name="repeatInterval" value="2000"/>
</bean>
<!--SchedulerFactoryBean-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
报错:Caused by: java.lang.ClassNotFoundException: org.springframework.transaction.TransactionException
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
… 41 more
不知道为啥需要事务的,人家报错缺那就加呗
<!--<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.17.RELEASE</version>
</dependency>-->
3)结果出来了,不知道为啥@Test测试不行,写了main函数测试就没毛病。。。。
4)使用quartz比较方便的地方在于
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="job1"/>
<property name="cronExpression" value="0 0 12 * *"/><!--每天中午十二点运行一次-->
</bean>
``
完犊子,这个老师讲到一半开始卖课,没有继续学下去。
首先,定时任务不适合多线程处理。如果quartz集群处理业务,就需要一个调度者。`其利用数据库的读锁,保证不发生重复任务。一般应用于比较核心的业务,通常由架构师完成。