我所知道的java定时任务的几种常用方式:
1、spring schedule注解的方式
2、spring schedule配置文件的方式
3、java类继承TimerTask
注解方式:
1、使用maven创建spring项目,schedule在spring-context.jar的包下边,因此需要导入与之相关的包;同时,我配的是spring web项目,也同时导入了spring-web和spring-webmvc的包,如下:
<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.7.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.1.6.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>4.1.6.RELEASE</version></dependency>
maven导包配置只需要如下就好,其他相关的依赖,maven会自行解决。
2、配置spring项目的基础文件spring.xml
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns:task="http://www.springframework.org/schema/task"xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/taskhttp://www.springframework.org/schema/task/spring-task-3.1.xsd"><!--开启定时任务--><task:annotation-driven/><!--开启注解--><context:annotation-config/><!--指定相关的包路径--><context:component-scanbase-package="scheduleTest"/></beans>
3、编写java业务代码,需要在类声明上边添加@Component注解,并在需要定时任务执行的方法声明上添加@Scheduled(cron = "0/5 * * * * ?")注解以及相关的参数。
参数使用可以参考 SpringSchedule - 定时任务(参数示例:Cron表达式),我示例中表示每五秒执行一次:
packagescheduleTest; importjava.text.SimpleDateFormat; importjava.util.Date; importorg.springframework.scheduling.annotation.Scheduled; importorg.springframework.stereotype.Component; /*** spring定时器1*/@ComponentpublicclassScheduleTest { @Scheduled(cron="0/5 * * * * ?") publicvoidschTest1() { Datedate=newDate(); SimpleDateFormatsim=newSimpleDateFormat("yyyy-MM-dd HH:mm:ss"); StringdateStr=sim.format(date); System.out.println("这是spring定时器1,每五秒执行一次,当前时间:"+dateStr); } }
4、web项目的基础配置文件web.xml
<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param><listener><description>spring监听器</description><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener></web-app>
上边的配置中使用了spring的上下文监听器,在这种情况下项目启动后,spring.xml中的定时任务配置才会生效。但是这不是唯一的方法,也可以使用如下的配置,启动项目后可以看到一样的效果:
<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"id="WebApp_ID"version="3.0"><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></context-param><servlet><servlet-name>dispatcher</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcher</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
这里是吧spring的监听器换成了mvc的调度器,在调度器加载的时候就运行spring.xml中的定时任务配置,因此启动项目后看到效果一样。如果把上边的监听器和mvc的调度器一起配在这里,会看到启动项目后同一时间内这个定时任务需要执行的业务会执行两次。