java定時實現啓動任務
1、Timer+TimerTask
(1)建立MyTask類繼承TimerTask
public class MyTask extends TimerTask {
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(" Hello world ----Timetask");
}
}
(2)建立監聽器,如果是服務器啓動就掉用該方法,則需要實現ServletContextListener上下文監聽器的接口。
public class MyListenner implements ServletContextListener {
private Timer timer=null;
@Override
public void contextDestroyed(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer.cancel();
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
// TODO Auto-generated method stub
timer=new Timer(true);
//設置任務計劃,啓動和間隔時間
timer.schedule(new MyTask(), 0, 2000);
}
}
(3)在web.xml文件中進行配置監聽器
<!-- 設置定時啓動監聽器 Timer+TimerTask -->
<listener>
<listener-class>spring.study.timetest.MyListenner</listener-class>
</listener>
(4)如果要實現業務邏輯,則需要在MyTask中封裝方法,進行調用即可。
2、Spring+quartz
Maven項目中加入quartz.jar,具體步驟如下:
(1)pom.xml文件添加
<!-- 定時任務 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
(2)新建類(執行任務類,現在僅僅是一個測試,就打印出helloworld吧)
public class HelloWorld {
public void sayHello(){
System.out.println("Hello World!");
}
}
(3)在spring配置文件中配置
具體分爲3步:
<1>、在配置信息中SchedulerFactoryBean定義了多個觸發器,在啓動Spring後,就是從這個配置獲取到觸發器。
<2>、觸發器是通過CronTriggerBean來配置,它設置了任務類和任務啓動的時間
<3>、MethodInvokingJobDetailFactoryBean是任務類的配置,設置了執行任務的對象是那個Bean和需要執行這個Bean的那個方法。
配置文件具體如下:
<!-- 通過類名進行注入 -->
<!-- 配置任務 -->
<bean id="helloTaskJob" class="spring.study.timetest.HelloWorld"></bean>
<bean id="helloJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="group" value="job_work"/>
<property name="name" value="job_work_name"/>
<!--false表示等上一個任務執行完後再開啓新的任務-->
<property name="concurrent" value="false"/>
<property name="targetObject">
<ref bean="helloTaskJob"></ref>
</property>
<property name="targetMethod">
<value>sayHello</value>
</property>
</bean>
<!-- 配置觸發器 -->
<bean id="helloTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail">
<ref bean="helloJobDetail"/>
</property>
<!-- 每天的8點到21點每隔1分鐘觸發-->
<property name="cronExpression">
<value>0 * 08-21 * * ?</value>
</property>
</bean>
<!--調度工廠 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!-- 添加觸發器 -->
<property name="triggers">
<list>
<ref bean="helloTrigger" />
</list>
</property>
</bean>
(4)啓動Tomcat即可實現每分鐘打印一條Hello World。
(5)Quartz與具體實現業務相聯繫,怎麼實現?(Spring中)
在具體業務相聯繫的話,基本上都不是隻執行一條靜態語句那麼簡單,可以在具體調用類中實現業務邏輯實現即可,只需要改動執行類,也就是上面的HelloWorld類,具體變化如下(只是舉個簡單例子):
public class HelloWorld {
@Autowired
private PeopleDao peopleDao;
public void setPeopleDao(PeopleDao peopleDao) {
this.peopleDao = peopleDao;
}
public PeopleDao getPeopleDao() {
return peopleDao;
}
@Transactional
//具體寫業務實現即可
public void sayHello(){
People people=peopleDao.getPerson(2);
System.out.println(people.getSchoolName());
System.out.println("Hello World!");
}
}
參考:http://blog.csdn.net/52rainbow/article/details/4004206