• spring 定时器


    总结一下我使用过的4种类型的定时器:@Scheduled注解、quartz、new Timer().schedule、使用线程控制。

    1.@Scheduled注解

    @Scheduled注解是最简单的方式,只需要启用定时器,在方法上添加注解即可。

    在spring配置中加入:

    <!-- 启用注解定时器 -->
    <!-- 开启定时任务 -->
    <task:executor id="executor" pool-size="5"/>    //执行者数
    <task:scheduler id="scheduler" pool-size="10"/> //线程数
    <task:annotation-driven executor="executor" scheduler="scheduler"/>

    在要具体的方法上加入注解@Scheduled 
    @Scheduled(cron = "0 0 * * * ? ")
    public void myTask(){
    //定时任务......
    }

    @Scheduled注解各参数详解:https://www.jianshu.com/p/1defb0f22ed1

      

    2.quartz

               quartz使用的是可配置的方式,将所有的定时器都配置再一个xml文件里面。步骤如下:

    1.创建一个spring的配置文件:spring-quartz.xml

    2.定义工作任务的job

    3.定义触发器Trigger并与job绑定

    4.定义调度器,并将Trigger注册到scheduler

    <bean id="myTask" class="cn.coolwind.MyTask"/>
    <!-- 1.定义工作任务job -->
    <bean id="testJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    <!-- 定时器的类 -->
    <property name="targetObject" ref="myTask"></property>
    <!-- 需要定时执行的方法 -->
    <property name="targetMethod" value="test"></property>
    <property name="concurrent" value="false"></property>
    </bean>
    <!-- 2.定义触发器Trigger并与Job绑定 -->
    <bean id="testJobTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail" ref="testJob"/>
    <!-- 根据需要设置定时执行的时间 -->
    <property name="cronExpression" value="0 0/5 * * * ?" />
    </bean>
    
    <!-- 3.定义调度器,并将trigger注册进去 -->
    <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
    <list>
    <ref local="testJobTrigger" />
    </list>
    </property>
    </bean>


    最后记得将xml写入web.xml里!

    <init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
    classpath:applicationContext.xml,
    classpath:log4j.xml,
    classpath:spring-quartz.xml
    </param-value>
    </init-param>
    

      

    3.使用Timer

    使用Timer的schedule,schedule有3个参数:

    schedule(TimerTask task, long delay, long period)
    第一个为定时任务,根据业务需要重写TimerTask的run方法即可;

    第二个为延时启动,单位毫秒;

    第三个位多久运行一次,单位毫秒;

    new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
    try {
    //do Something
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    },0,5L * 60 * 1000);
    

      

    4.使用线程控制

       使用线程来控制就更灵活一些,可以根据自己的需要判断什么时候运行,什么时候停止,这需要对java的线程有一定的了解。

    public class TaskTest {
    private static final ExecutorService pool = Executors.newFixedThreadPool(5);// 线程池
    public static final TaskTest me = new TaskTest();
    public final int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9};
    
    public static void main(String[] args) {
    me.start();
    }
    
    private void start() {
    pool.execute(new Runnable() {
    @Override
    public void run() {
    while (true) {
    try {
    for (int i = 0; i < arr.length; i++) {
    if (1 == arr[i]) {
    System.out.println("start!");
    Thread.sleep(1*1000L);
    }
    if (6 == arr[i]) {
    System.out.println("stop!");
    Thread.sleep(5*1000L);
    }
    System.out.println(arr[i]);
    if (9 == arr[i]) {
    System.out.println("end!");
    Thread.sleep(5*1000L);
    }
    }
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    }
    }
    });
    }
    }
    

      


     

  • 相关阅读:
    Pytest单元测试框架——Pytest+Allure+Jenkins的应用
    Postman+Newman+Git+Jenkins接口自动化测试
    Pytest单元测试框架——Pytest简介
    unittest单元测试框架
    Postman学习笔记(二)
    CukeTest+Puppeteer的Web自动化测试(二)
    Postman学习笔记(一)
    CukeTest+Puppeteer的Web自动化测试(一)
    Puppeteer笔记(八):Puppeteer执行自定义Javascript方法
    Puppeteer笔记(七):Puppeteer切换浏览器TAB页
  • 原文地址:https://www.cnblogs.com/qqfff/p/12795874.html
Copyright © 2020-2023  润新知