亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring Boot延遲執(zhí)行實(shí)現(xiàn)方法

 更新時(shí)間:2025年04月01日 16:53:18   作者:何中應(yīng)  
本文介紹了在Spring Boot項(xiàng)目中延遲執(zhí)行方法的實(shí)現(xiàn),以及延遲執(zhí)行下聲明式事務(wù)和編程式事務(wù)的使用情況,感興趣的朋友一起看看吧

說(shuō)明:本文介紹如何在Spring Boot項(xiàng)目中,延遲執(zhí)行某方法,及討論延遲執(zhí)行方法的事務(wù)問(wèn)題。

搭建Demo

首先,創(chuàng)建一個(gè)Spring Boot項(xiàng)目,pom.xml如下:

<?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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.12</version>
        <relativePath/>
    </parent>
    <groupId>com.hezy</groupId>
    <artifactId>delay_thread_demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>
    </dependencies>
</project>

寫(xiě)個(gè)接口,打印進(jìn)入方法時(shí)的時(shí)間

import com.hezy.service.DelayService;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.Date;
@RestController
@RequestMapping("/demo")
@Log4j2
public class DemoController {
    @Autowired
    private DelayService delayService;
    @GetMapping
    public String demo() {
        return "Hello World!";
    }
    @GetMapping("/delay1/{time}")
    public String delay1(@PathVariable Integer time) {
        log.info("enter delay1...date={} time={}",
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
        delayService.delay1(time);
        return "success";
    }
}

延遲執(zhí)行實(shí)現(xiàn)

delayService,delay1()實(shí)現(xiàn),如下:

    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    /**
     * 延遲執(zhí)行
     * @param time
     */
    public void delay1(Integer time) {
        scheduler.schedule(() -> {
            log.info("run delay1...date={} time={}",
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
        }, time, TimeUnit.SECONDS);
    }

就是開(kāi)了一個(gè)線程來(lái)執(zhí)行,可設(shè)置延遲時(shí)間。啟動(dòng)項(xiàng)目,測(cè)試,如下:

(發(fā)送請(qǐng)求,響應(yīng)結(jié)果即刻返回)

(控制臺(tái)可見(jiàn)任務(wù)延遲5秒執(zhí)行)

事務(wù)問(wèn)題

寫(xiě)個(gè)實(shí)體類(lèi)

import lombok.Data;
@Data
public class User {
    private Integer id;
    private String username;
    private String password;
}

再寫(xiě)個(gè)Mapper,里面寫(xiě)個(gè)insert()方法

import com.hezy.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface UserMapper {
    @Insert("insert into user (id, username, password) values (#{id}, #{username}, #{password})")
    void insert(User user);
}

新建個(gè)延遲方法,delay2(),方法生加聲明式注解,方法內(nèi)手動(dòng)制造一個(gè)異常

(controller)

    @PostMapping("/delay2/{time}")
    public String delay2(@RequestBody User user, @PathVariable Integer time) {
        log.info("enter delay2...date={} time={}",
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
        delayService.delay2(user, time);
        return "success";
    }

(service)

    /**
     * 聲明式事務(wù)
     */
    @Transactional(rollbackFor = Exception.class)
    public void delay2(User user, Integer time) {
        scheduler.schedule(() -> {
            log.info("run delay2...date={} time={}",
                    new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
            userMapper.insert(user);
            int i = 1 / 0;
            user.setId(3);
            userMapper.insert(user);
        }, time, TimeUnit.SECONDS);
    }

啟動(dòng)項(xiàng)目,調(diào)用方法

控制臺(tái)沒(méi)有報(bào)錯(cuò)

數(shù)據(jù)庫(kù),插入了一條數(shù)據(jù),事務(wù)沒(méi)有控制住

以上說(shuō)明,聲明式事務(wù)無(wú)法控制延遲執(zhí)行的方法,并且異常也被線程內(nèi)捕獲了,沒(méi)有拋出來(lái)。

編程式事務(wù)

試下編程式事務(wù),手動(dòng)實(shí)現(xiàn)事務(wù),如下:

(controller)

    @PostMapping("/delay3/{time}")
    public String delay3(@RequestBody User user, @PathVariable Integer time) {
        log.info("enter delay3...date={} time={}",
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
        delayService.delay3(user, time);
        return "success";
    }

(service)

    @Autowired
    private PlatformTransactionManager transactionManager;
    /**
     * 編程式事務(wù)
     */
    public void delay3(User user, Integer time) {
        scheduler.schedule(() -> {
            TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
            try {
                log.info("run delay3...date={} time={}",
                        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()), time);
                userMapper.insert(user);
                // 故意產(chǎn)生異常
                int i = 1 / 0;
                user.setId(3);
                userMapper.insert(user);
                // 提交事務(wù)
                transactionManager.commit(status);
            } catch (Exception e) {
                transactionManager.rollback(status);
                e.printStackTrace();
            }
        }, time, TimeUnit.SECONDS);
    }

把數(shù)據(jù)庫(kù)記錄刪掉,啟動(dòng)項(xiàng)目,測(cè)試

控制臺(tái)報(bào)錯(cuò)

數(shù)據(jù)庫(kù)沒(méi)有插入記錄,編程式事務(wù)控制住了

總結(jié)

本文介紹了在Spring Boot項(xiàng)目中延遲執(zhí)行方法的實(shí)現(xiàn),以及延遲執(zhí)行下聲明式事務(wù)和編程式事務(wù)的使用情況。

完整源碼:https://github.com/HeZhongYing/delay_thread_demo

到此這篇關(guān)于Spring Boot延遲執(zhí)行實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Spring Boot延遲執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    slf4j?jcl?jul?log4j1?log4j2?logback各組件系統(tǒng)日志切換

    這篇文章主要介紹了slf4j、jcl、jul、log4j1、log4j2、logback的大總結(jié),各個(gè)組件的jar包以及目前系統(tǒng)日志需要切換實(shí)現(xiàn)方式的方法,有需要的朋友可以借鑒參考下
    2022-03-03
  • 關(guān)于MVC的dao層、service層和controller層詳解

    關(guān)于MVC的dao層、service層和controller層詳解

    這篇文章主要介紹了關(guān)于MVC的dao層、service層和controller層詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成

    java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)隨機(jī)驗(yàn)證碼圖片生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • java?spring?mvc處理器映射器介紹

    java?spring?mvc處理器映射器介紹

    這篇文章主要介紹了java?spring?mvc處理器映射器,文章圍繞equestMapping解析映射介紹展開(kāi)源碼內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-03-03
  • Spring AOP定義AfterReturning增加實(shí)例分析

    Spring AOP定義AfterReturning增加實(shí)例分析

    這篇文章主要介紹了Spring AOP定義AfterReturning增加,結(jié)合實(shí)例形式分析了Spring面相切面AOP定義AfterReturning增加相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-01-01
  • 使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針

    使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針

    本文主要介紹了使用Mybatis時(shí)SqlSessionFactory對(duì)象總是報(bào)空指針,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • FilenameUtils.getName?函數(shù)源碼分析

    FilenameUtils.getName?函數(shù)源碼分析

    這篇文章主要為大家介紹了FilenameUtils.getName?函數(shù)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SpringBoot靜態(tài)資源映射規(guī)則淺析

    SpringBoot靜態(tài)資源映射規(guī)則淺析

    這篇文章主要介紹了SpringBoot靜態(tài)資源映射規(guī)則,今天在玩SpringBoot的demo的時(shí)候,放了張圖片在resources目錄下,啟動(dòng)區(qū)訪問(wèn)的時(shí)候,突然好奇是識(shí)別哪些文件夾來(lái)展示靜態(tài)資源的, 為什么有時(shí)候放的文件夾不能顯示,有的卻可以
    2023-02-02
  • 基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟

    基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟

    這篇文章主要給大家介紹了基于Java語(yǔ)言在窗體上實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲的完整步驟,文中通過(guò)圖文以及實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-02-02
  • SpringMVC異常處理知識(shí)點(diǎn)總結(jié)

    SpringMVC異常處理知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理的是關(guān)于SpringMVC異常處理相關(guān)知識(shí)點(diǎn)內(nèi)容,需要的朋友們學(xué)習(xí)下。
    2019-10-10

最新評(píng)論