java中定时执行任务

时间:2020-12-24 07:54:31

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