java中定時執行任務

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章