zoukankan      html  css  js  c++  java
  • 浅谈spring配置定时任务的几种方式

    网上看到好多关于定时任务的讲解,以前只简单使用过注解方式,今天项目中看到基于配置的方式实现定时任务,自己做个总结,作为备忘录吧。

    基于注解方式的定时任务

      首先spring-mvc.xml的配置文件中添加约束文件

    xmlns:task="http://www.springframework.org/schema/task" 
    http://www.springframework.org/schema/task  
    http://www.springframework.org/schema/task/spring-task-3.2.xsd 

    其次需要配置注解驱动

    <task:annotation-driven />

    添加你添加注解的扫描包

    <context:component-scan base-package="com.xxx.xxx" />

    最后贴上定时任务包代码

    package com.xxx.xxx;
    
    import org.springframework.scheduling.annotation.Scheduled;
    import org.springframework.stereotype.Component;
    
    @Component
    public class xxxTask {
        @Scheduled(cron = "0/5 * * * * ? ") // 间隔5秒执行
        public void xxx() {
            System.out.println("----定时任务开始执行-----");
        //执行具体业务逻辑----------  
            System.out.println("----定时任务执行结束-----");
        }
    }

    基于配置的定时任务调度框架Quartz

    引入依赖

    <dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
    </dependency>

      定义一个类,方法可以写多个为需要定时执行的任务

    public class AdminJob {
        
        public void job1() {
            System.out.pringln("执行了任务---");
        }
    }

    在spring.xml配置中添加

     <bean id="adminJob" class="com.xxx.xxx.AdminJob"/>
        <!--此处id值为需要执行的定时任务方法名-->
        <bean id="job1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="adminJob"/>
            <property name="targetMethod" value="job1"/>
        </bean>
    <!--此处为定时任务触发器--> <bean id="job1Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail"> <ref bean="job1"/> </property> <property name="cronExpression"> <value>0 15 0 16 * ?</value> </property> </bean>
    <bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="job1Trigger"/>
            </list>
        </property>
        <property name="taskExecutor" ref="executor"/>
    </bean>
        <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
            <property name="corePoolSize" value="10"/>
            <property name="maxPoolSize" value="100"/>
            <property name="queueCapacity" value="500"/>
        </bean>

     最后还有一种普通java的定时任务代码 基于线程池的方式实现定时任务

    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    public class Task3 {
      public static void main(String[] args) {
        Runnable runnable = new Runnable() {
          public void run() {
            // task to run goes here
            System.out.println("Hello !!");
          }
        };
        ScheduledExecutorService service = Executors
                        .newSingleThreadScheduledExecutor();
        service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.SECONDS);
      }
    }
  • 相关阅读:
    TVM性能评估分析(七)
    TVM性能评估分析(六)
    理论三:里式替换(LSP)跟多态有何区别?哪些代码违背了LSP?
    理论二:如何做到“对扩展开放、修改关闭”?扩展和修改各指什么?
    (转)浅谈 SOLID 原则的具体使用
    老一辈的革命先烈告诉我,凡事打好提前量
    理论一:对于单一职责原则,如何判定某个类的职责是否够“单一”?
    实战二(下):如何利用面向对象设计和编程开发接口鉴权功能?
    实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?
    12 | 实战一(下):如何利用基于充血模型的DDD开发一个虚拟钱包系统?
  • 原文地址:https://www.cnblogs.com/zhaoletian/p/10821426.html
Copyright © 2011-2022 走看看