zoukankan      html  css  js  c++  java
  • 使用spring-boot创建定时任务。同时创建多线程执行定时任务。

    1,下载spring-boot的maven工程:http://start.spring.io/  直接自定义工程名称。

    2 , 启动类增加注解:@EnableScheduling

    具体的业务代码:

    package com.huike.ftp.main;

    import java.util.Date;
    import java.util.concurrent.Executor;

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
    import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.TaskScheduler;
    import org.springframework.scheduling.Trigger;
    import org.springframework.scheduling.TriggerContext;
    import org.springframework.scheduling.annotation.AsyncConfigurer;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.scheduling.annotation.SchedulingConfigurer;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
    import org.springframework.scheduling.config.ScheduledTaskRegistrar;
    import org.springframework.scheduling.support.CronTrigger;
    import org.springframework.stereotype.Component;

    import com.huike.ftp.model.TransferPo;
    import com.huike.ftp.service.ParseFile;
    import com.huike.ftp.service.SftpUtil;

    @Configuration
    @Component
    @EnableScheduling
    public class DynamicTransfer implements SchedulingConfigurer, AsyncConfigurer {

    private final Logger logger = LogManager.getLogger(getClass());

    /**
    * 并行任务使用策略:多线程处理
    *
    * @return ThreadPoolTaskScheduler 线程池
    */
    @Bean(destroyMethod = "shutdown")
    public ThreadPoolTaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
    scheduler.setPoolSize(3);
    scheduler.setThreadNamePrefix("task-");
    scheduler.setAwaitTerminationSeconds(60);
    scheduler.setWaitForTasksToCompleteOnShutdown(true);
    return scheduler;
    }

    /*
    * 异步任务
    */
    @Override
    public Executor getAsyncExecutor() {
    Executor executor = taskScheduler();
    return executor;
    }

    /*
    * 异步任务 异常处理
    */
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
    return new SimpleAsyncUncaughtExceptionHandler();
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    TaskScheduler taskScheduler = taskScheduler();
    taskRegistrar.setTaskScheduler(taskScheduler);
    for (TransferPo transferPo : ParseFile.list) {
    schedule(taskRegistrar, transferPo);
    }

    }

    private void schedule(ScheduledTaskRegistrar taskRegistrar, TransferPo transferPo) {
    taskRegistrar.addTriggerTask(new Runnable() {
    @Override
    public void run() {
    try {
    logger.info("执行文件迁移:" + transferPo.toString());
    new SftpUtil().programe(transferPo);
    } catch (Exception e) {
    logger.error("运行报错", e);
    }
    }
    }, new Trigger() {
    @Override
    public Date nextExecutionTime(TriggerContext triggerContext) {
    // 定时任务触发,可修改定时任务的执行周期
    CronTrigger trigger = new CronTrigger(transferPo.getCron());
    Date nextExecDate = trigger.nextExecutionTime(triggerContext);
    return nextExecDate;
    }
    });
    }
    }

    注意在整个的业务代码当中,设置了应对的cron表达式,定时的执行相应线程中的业务逻辑。

    测试类代码:

    package com.huike.ftp.main;

    import com.huike.ftp.service.ParseFile;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;

    @SpringBootApplication
    public class FtpMain {

    /**
    * 启动入口
    *
    * @param args
    * @throws Exception
    */
    public static void main(String[] args) throws Exception {
    if (args == null || args.length < 1) {
    throw new Exception("请传入hkftp.properties文件绝对路径的参数");
    }
    ParseFile.attributes(args[0]);

    SpringApplication.run(FtpMain.class, args);

    }
    }

    注意事项:测试类和相对应的代码需要放在同一个包下面。

    我创建的maven工程项目,其中设置打包的主类和将所有依赖的包都打成jar包。注意打包方式。

    所以具体的pom文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.huike.ftp.hkftp</groupId>
    <artifactId>hkftp</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>hkftp</name>
    <description>Demo project for Spring Boot</description>

    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.0.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    </properties>

    <dependencies>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>

    <dependency>
    <groupId>commons-logging</groupId>
    <artifactId>commons-logging</artifactId>
    <version>1.1.3</version>
    </dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.21</version>
    <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
    <dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.42</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.apache.directory.studio/org.apache.commons.io -->
    <dependency>
    <groupId>org.apache.directory.studio</groupId>
    <artifactId>org.apache.commons.io</artifactId>
    <version>2.4</version>
    </dependency>

    </dependencies>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <configuration>
    <fork>true</fork>
    <mainClass>com.huike.ftp.main.FtpMain</mainClass>
    </configuration>
    <executions>
    <execution>
    <goals>
    <goal>repackage</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.0</version>
    <configuration>
    <source>1.8</source>
    <target>1.8</target>
    </configuration>
    </plugin>
    <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.5.5</version>
    <configuration>
    <archive>
    <manifest>
    <mainClass>com.huike.ftp.main.FtpMain</mainClass>
    </manifest>
    </archive>
    <descriptorRefs>
    <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    </configuration>
    <executions>
    <execution>
    <id>make-jar</id>
    <!-- 绑定到package生命周期阶段上 -->
    <phase>package</phase>
    <goals>
    <!-- 绑定到package生命周期阶段上 -->
    <goal>single</goal>
    </goals>
    </execution>
    </executions>
    </plugin>
    </plugins>
    </build>
    </project>

  • 相关阅读:
    关于svcutil.exe
    为什么说上ERP找死?
    竞争软件微信公众号上线
    无需ORM的数据库
    日期格式化和计算工具
    数据格式化工具
    Redis集群安装
    guava入门学习3(集合工具)
    guava入门学习2(新集合)
    mac环境下基于jdk1.8,maven搭建dubbo,zookeeper入门小案例
  • 原文地址:https://www.cnblogs.com/gxgd/p/8652612.html
Copyright © 2011-2022 走看看