依星源码资源网,依星资源网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

【好消息,好消息,好消息】VIP会员可以发表文章赚积分啦 !
查看: 6|回复: 0

springboot制作,每隔30分钟执行一次任务,本次任务没有执行完,下次任务不允许执行

[复制链接] 主动推送

1万

主题

1万

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
14135
发表于 10 小时前 | 显示全部楼层 |阅读模式
springboot制作,每隔30分钟执行一次任务,本次任务没有执行完,下次任务不允许执行
在 Spring Boot 中,你可以使用 Spring 的 `@Scheduled` 注解来实现定时任务,同时通过控制任务的执行状态来确保本次任务没有执行完时,下次任务不允许执行。以下是具体的实现步骤和示例代码:

### 1. 添加依赖
确保你的 `pom.xml` 文件中包含 Spring Boot 的相关依赖,特别是 `spring-boot-starter` 和 `spring-boot-starter-web`。

```xml:pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
```

### 2. 启用定时任务
在 Spring Boot 主应用类上添加 `@EnableScheduling` 注解来启用定时任务功能。

```java:src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

### 3. 创建定时任务类
创建一个包含定时任务的类,并使用 `@Scheduled` 注解来定义任务的执行时间。同时,使用一个布尔变量来控制任务的执行状态。

```java:src/main/java/com/example/demo/ScheduledTask.java
package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
    private boolean isTaskRunning = false;

    @Scheduled(fixedRate = 30 * 60 * 1000) // 每30分钟执行一次
    public void performTask() {
        if (isTaskRunning) {
            logger.info("上一次任务还未执行完,本次任务跳过。");
            return;
        }

        try {
            isTaskRunning = true;
            logger.info("任务开始执行。");
            // 模拟任务执行
            Thread.sleep(10000); // 模拟任务执行时间
            logger.info("任务执行完成。");
        } catch (InterruptedException e) {
            logger.error("任务执行被中断: ", e);
        } finally {
            isTaskRunning = false;
        }
    }
}
```

### 代码解释
- `@EnableScheduling`:在主应用类上添加该注解,启用 Spring 的定时任务功能。
- `@Scheduled(fixedRate = 30 * 60 * 1000)`:在 `performTask` 方法上添加该注解,指定任务每隔 30 分钟执行一次。
- `isTaskRunning`:一个布尔变量,用于控制任务的执行状态。当任务开始执行时,将其设置为 `true`;任务执行完成后,将其设置为 `false`。
- 在 `performTask` 方法中,首先检查 `isTaskRunning` 的状态。如果为 `true`,表示上一次任务还未执行完,本次任务将跳过。

通过以上步骤,你可以实现一个每隔 30 分钟执行一次的定时任务,并且确保本次任务没有执行完时,下次任务不会执行。


启动时就执行一次,

在 Spring Boot 中,你可以使用 `@Scheduled` 注解来实现定时任务,同时结合 `ScheduledExecutorService` 或简单的标志位来确保任务在未完成时不会再次启动。下面是一个示例代码,展示了如何实现每隔 30 分钟执行一次任务,并且在任务未完成时不允许下次任务执行,同时在启动时立即执行一次任务。

### 步骤

#### 1. 创建 Spring Boot 项目
首先,确保你已经创建了一个 Spring Boot 项目。如果还没有,可以使用 Spring Initializr(https://start.spring.io/)来创建一个基本的 Spring Boot 项目,添加 `Spring Web` 和 `Spring Boot DevTools` 依赖。

#### 2. 配置定时任务
在 Spring Boot 项目中,你需要启用定时任务。可以通过在主应用类上添加 `@EnableScheduling` 注解来实现。

```java:src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
```

#### 3. 创建定时任务类
创建一个定时任务类,使用 `@Scheduled` 注解来定义任务的执行时间。同时,使用一个标志位来确保任务在未完成时不会再次启动。

```java:src/main/java/com/example/demo/ScheduledTask.java
package com.example.demo;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class ScheduledTask {

    private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
    private boolean isTaskRunning = false;

    public ScheduledTask() {
        // 启动时立即执行一次任务
        executeTask();
    }

    @Scheduled(fixedRate = 30 * 60 * 1000) // 每隔 30 分钟执行一次
    public void scheduledTask() {
        if (!isTaskRunning) {
            executeTask();
        }
    }

    private void executeTask() {
        isTaskRunning = true;
        try {
            logger.info("任务开始执行: {}", getCurrentTime());
            // 模拟任务执行,这里可以替换为实际的业务逻辑
            Thread.sleep(10000); // 模拟任务执行 10 秒
            logger.info("任务执行完成: {}", getCurrentTime());
        } catch (InterruptedException e) {
            logger.error("任务执行被中断", e);
        } finally {
            isTaskRunning = false;
        }
    }

    private String getCurrentTime() {
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    }
}
```

### 代码解释
1. **`@EnableScheduling` 注解**:在主应用类上添加该注解,启用 Spring Boot 的定时任务功能。
2. **`@Scheduled` 注解**:在 `scheduledTask` 方法上添加该注解,设置 `fixedRate = 30 * 60 * 1000`,表示每隔 30 分钟执行一次任务。
3. **`isTaskRunning` 标志位**:用于标记任务是否正在执行。在任务开始执行时将其设置为 `true`,任务执行完成后将其设置为 `false`。
4. **构造函数**:在 `ScheduledTask` 类的构造函数中调用 `executeTask` 方法,确保在应用启动时立即执行一次任务。
5. **`executeTask` 方法**:实际执行任务的方法,使用 `try-catch-finally` 块确保任务执行完成后将 `isTaskRunning` 标志位设置为 `false`。

### 运行项目
启动 Spring Boot 项目,你将看到任务在启动时立即执行一次,然后每隔 30 分钟执行一次。如果任务在 30 分钟内未完成,下次任务将不会启动。



完整代码 ScheduledTask.java 如下:

  1. package com.estar.wdserversyn.task;

  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.scheduling.annotation.Scheduled;
  6. import org.springframework.stereotype.Component;

  7. import java.time.LocalDateTime;
  8. import java.time.format.DateTimeFormatter;

  9. @Component
  10. public class ScheduledTask {

  11.     private static final Logger logger = LoggerFactory.getLogger(ScheduledTask.class);
  12.     private boolean isTaskRunning = false;

  13.     public ScheduledTask() {
  14.         // 启动时立即执行一次任务
  15.         executeTask();
  16.     }

  17.     @Scheduled(fixedRateString = "${synconfig.fixedRate}")
  18. //    @Scheduled(fixedRate = 1 * 60 * 1000) // 每隔 30 分钟执行一次
  19.     public void preScheduledTask() {
  20.         if (!isTaskRunning) {
  21.             executeTask();
  22.         }
  23.     }

  24.     private void executeTask() {
  25.         isTaskRunning = true;
  26.         try {
  27. //            System.out.println("定时执行");
  28.             logger.info("任务开始执行: {}", getCurrentTime());
  29.             // 模拟任务执行,这里可以替换为实际的业务逻辑
  30.             Thread.sleep(10000); // 模拟任务执行 10 秒
  31.             logger.info("任务执行完成: {}", getCurrentTime());
  32.         } catch (InterruptedException e) {
  33.             logger.error("任务执行被中断", e);
  34.         } finally {
  35.             isTaskRunning = false;
  36.         }
  37.     }

  38.     private String getCurrentTime() {
  39.         return LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
  40.     }
  41. }
复制代码


相关帖子

扫码关注微信公众号,及时获取最新资源信息!下载附件优惠VIP会员6折;永久VIP4折
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

免责声明:
1、本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与商业和非法行为,请在24小时之内自行删除!
2、本站所有内容均由互联网收集整理、网友上传,并且以计算机技术研究交流为目的,仅供大家参考、学习,请勿任何商业目的与商业用途。
3、若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
4、论坛的所有内容都不保证其准确性,完整性,有效性,由于源码具有复制性,一经售出,概不退换。阅读本站内容因误导等因素而造成的损失本站不承担连带责任。
5、用户使用本网站必须遵守适用的法律法规,对于用户违法使用本站非法运营而引起的一切责任,由用户自行承担
6、本站所有资源来自互联网转载,版权归原著所有,用户访问和使用本站的条件是必须接受本站“免责声明”,如果不遵守,请勿访问或使用本网站
7、本站使用者因为违反本声明的规定而触犯中华人民共和国法律的,一切后果自己负责,本站不承担任何责任。
8、凡以任何方式登陆本网站或直接、间接使用本网站资料者,视为自愿接受本网站声明的约束。
9、本站以《2013 中华人民共和国计算机软件保护条例》第二章 “软件著作权” 第十七条为原则:为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。若有学员需要商用本站资源,请务必联系版权方购买正版授权!
10、本网站如无意中侵犯了某个企业或个人的知识产权,请来信【站长信箱312337667@qq.com】告之,本站将立即删除。
郑重声明:
本站所有资源仅供用户本地电脑学习源代码的内含设计思想和原理,禁止任何其他用途!
本站所有资源、教程来自互联网转载,仅供学习交流,不得商业运营资源,不确保资源完整性,图片和资源仅供参考,不提供任何技术服务。
本站资源仅供本地编辑研究学习参考,禁止未经资源商正版授权参与任何商业行为,违法行为!如需商业请购买各资源商正版授权
本站仅收集资源,提供用户自学研究使用,本站不存在私自接受协助用户架设游戏或资源,非法运营资源行为。
 
在线客服
点击这里给我发消息 点击这里给我发消息 点击这里给我发消息
售前咨询热线
312337667

微信扫一扫,私享最新原创实用干货

QQ|免责声明|小黑屋|依星资源网 ( 鲁ICP备2021043233号-3 )|网站地图

GMT+8, 2025-3-12 23:48

Powered by Net188.com X3.4

邮箱:312337667@qq.com 客服QQ:312337667(工作时间:9:00~21:00)

快速回复 返回顶部 返回列表