【第23章】spring-async(异步)

文章目录

  • 前言
  • 一、业务类
    • 1. controller
    • 2. service
    • 3. dao
  • 二、核心配置
    • 1.配置类
    • 2.测试类
    • 3.测试结果
  • 总结


前言

在原生Java中,我们想要实现异步需要新建线程或线程池提交任务的方式,spring提供了一种基于注解的方式实现异步。


一、业务类

1. controller

package org.example.async.controller;

import org.example.async.service.AsyncService;
import org.example.async.service.impl.AsyncServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * Create by zjg on 2024/4/21
 */
@Controller
public class AsyncController {
    private Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
    @Autowired
    AsyncService asyncService;
    public void run(){
        logger.debug("AsyncController开始执行");
        asyncService.run();
        logger.debug("AsyncController执行结束");
        //主线程到这里已经处理完成了,但不能过早结束,否则看不到后面日志输出
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}

2. service

package org.example.async.service;

/**
 * Create by zjg on 2024/4/21
 */
public interface AsyncService {
    public void run();
}

package org.example.async.service.impl;

import org.example.async.dao.AsyncDao;
import org.example.async.service.AsyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

/**
 * Create by zjg on 2024/4/21
 */
@Service
public class AsyncServiceImpl implements AsyncService {
    private Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
    @Autowired
    AsyncDao asyncDao;
    @Async
    @Override
    public void run(){
        logger.debug("AsyncService开始执行");
        try {
            Thread.sleep(2000);
            asyncDao.run();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        logger.debug("AsyncService执行结束");
    }
}

3. dao

package org.example.async.dao;

/**
 * Create by zjg on 2024/4/21
 */
public interface AsyncDao {
    public void run();
}

package org.example.async.dao.impl;

import org.example.async.dao.AsyncDao;
import org.example.async.service.impl.AsyncServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

/**
 * Create by zjg on 2024/4/21
 */
@Repository
public class AsyncDaoImpl implements AsyncDao {
    private Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);

    @Override
    public void run() {
        logger.debug("AsyncDao开始执行");
        logger.debug("AsyncDao执行结束");
    }
}

二、核心配置

1.配置类

package org.example.async.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.core.task.SimpleAsyncTaskExecutor;
import org.springframework.core.task.TaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;

/**
 * Create by zjg on 2024/4/20
 */
@ComponentScan("org.example.async")
@EnableAsync
public class SpringConfig {
    @Bean
    public TaskExecutor taskExecutor(){
        return new SimpleAsyncTaskExecutor();
    }
}

2.测试类

package org.example.async;

import org.example.async.config.SpringConfig;
import org.example.async.controller.AsyncController;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;

/**
 * Create by zjg on 2024/4/21
 */
@SpringJUnitConfig(SpringConfig.class)
public class SpringTest {
    @Autowired
    AsyncController asyncController;
    @Test
    public void async(){
        asyncController.run();
    }
}

3.测试结果

[2024-04-21 19:28:45.146][main][DEBUG]- org.example.async.controller.AsyncController.run(AsyncController.java:19) - AsyncController开始执行
[2024-04-21 19:28:45.163][main][DEBUG]- org.example.async.controller.AsyncController.run(AsyncController.java:21) - AsyncController执行结束
[2024-04-21 19:28:45.163][SimpleAsyncTaskExecutor-1][DEBUG]- org.example.async.service.impl.AsyncServiceImpl.run(AsyncServiceImpl.java:22) - AsyncService开始执行
[2024-04-21 19:28:47.168][SimpleAsyncTaskExecutor-1][DEBUG]- org.example.async.dao.impl.AsyncDaoImpl.run(AsyncDaoImpl.java:18) - AsyncDao开始执行
[2024-04-21 19:28:47.168][SimpleAsyncTaskExecutor-1][DEBUG]- org.example.async.dao.impl.AsyncDaoImpl.run(AsyncDaoImpl.java:19) - AsyncDao执行结束
[2024-04-21 19:28:47.169][SimpleAsyncTaskExecutor-1][DEBUG]- org.example.async.service.impl.AsyncServiceImpl.run(AsyncServiceImpl.java:29) - AsyncService执行结束

可以看到controller由main线程执行,service和dao由线程池中的线程负责执行。


总结

回到顶部

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/576061.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode in Python 48. Rotate Image/Matrix (旋转图像/矩阵)

旋转图像/矩阵的重点是寻找旋转前后对应位置的坐标关系。 示例: 图1 旋转图像/矩阵的输入输出示意图 代码: class Solution:def rotate(self, matrix):n len(matrix)for i in range(n // 2):for j in range(i, n - 1 - i):topleft matrix[i][j]ma…

ArcGIS小技巧——由图片创建点符号

一张合格的专题地图,除了内容的准确性和丰富性以外,美观性也是必不可少的。而Arcgis符号库中的符号非常有限,有时并不能很好的展现出地图要素的特点。因此,学会自定义符号就显得尤其重要了。今天,小编将结合实例&#…

AI大模型探索之路-训练篇4:大语言模型训练数据集概览

文章目录 前言一、常用的预训练数据集1、网页2、书籍3、维基百科4、代码5、混合型数据集 二、常用微调数据集1、指令微调数据集1.1 自然语言处理任务数据集1.2 日常对话数据集1.3 合成数据集 2、人类对齐数据集 前言 在人工智能领域,构建强大的AI系统的关键步骤之一…

synchronized 之谜

序言 本文给大家介绍一下 synchronized 关键字的部分原理。 一、内存中的 Java 对象 class A {private String attr; }先引入一个问题:上面类 A 有一个属性 attr。当类 A 实例化之后的对象在内存中是如何表示的呢? 在内存中,Java 对象由三…

Prompt Engineering,提示工程

什么是提示工程? 提示工程也叫【指令工程】。 Prompt发送给大模型的指令。比如[讲个笑话]、[用Python编个贪吃蛇游戏]、[给男/女朋友写情书]等看起来简单,但上手简单精通难 [Propmpt]是AGI时代的[编程语言][Propmpt]是AGI时代的[软件工程][提示工程]是…

Docker与Linux容器:“探索容器化技术的奥秘”

目录 一、Docker概述 二、容器技术的起源: 三、Linux容器 四、Docker的出现 五、Docker容器特点: 六、Docker三大概念: 容器: 镜像: 仓库: 七、Docker容器常用命令 一、Docker概述 在云原生时代&…

漫谈车辆诊断之DTC的状态位

搞车辆诊断测试的,离不开对DTC的状态位的测试 DTC的状态位是8个bit,每个bit代表不同的意思,每个bit置1或者置0都要满足一定的条件 初学者,很容易被这个搞得头很大 今天我们就来详细拆解一下,扫除你心中的疑惑 我们以…

8个拿来即用的Python自动化脚本!

每天你都可能会执行许多重复的任务,例如阅读新闻、发邮件、查看天气、清理文件夹等等,使用自动化脚本,就无需手动一次又一次地完成这些任务,非常方便。而在某种程度上,Python 就是自动化的代名词。 今天分享 8 个非常…

发布自己的Docker镜像到DockerHub

学会了Dockerfile生成Docker image 之后,如何上传自己的镜像到 DockerHub呢?下面我以自己制作的 bs-cqhttp 镜像为例,演示一下如何将自己的镜像发布到 Docker 仓库。 1 生成自己的 Docker 镜像 1.1 实例镜像用到的文件 图1 实例镜像制作用到…

stm32f103zet6_ADC_中断_2

1基本配置请查看 ADC_1 1stm32cubeMX配置 与ADC-1 区别在于配置了NVIC 2代码设置 回调函数 void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc) 这个回调函数在ADC正常转换完成后被调用。当你启动一个ADC转换(使用HAL_ADC_Start_IT()或类似函数&#x…

【数据结构(邓俊辉)学习笔记】绪论04——算法分析

文章目录 0. 前言1. 算法分析2.级数2.1基本形式2.2 收敛级数 3.循环 vs 级数4.示例 0. 前言 通过以基本计算模型作为参照,并且以大O记号的形式在上面添加适当刻度,已经建立一套对DSA进行分析的完整工具和体系。不清楚的可以看看复杂度度量 、复杂度分析…

git 命令怎么回退到指定的某个提交 commit hash 并推送远程分支?

问题 如下图,我要回退到 【002】Babel 的编译流程 这一次提交 解决 1、先执行下面命令,输出日志,主要就是拿到提交 commit 的 hash,上图红框即可 git log或者 vscode 里面直接右击,copy sha 2、执行下面命令回退 g…

【Linux】如何进行用户之间的切换——指令su

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

【Linux系统编程】基础指令(二)

💞💞 前言 hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页&#x…

【OceanBase诊断调优】——hpet(高精度时钟源)引起的CPU高问题排查

最近总结一些诊断OCeanBase的一些经验,出一个【OceanBase诊断调优】专题出来,也欢迎大家贡献自己的诊断OceanBase的方法。 1. 前言 昨天在问答区帮忙排查一个用户CPU高的问题,帖子链接:《刚刚新安装的OceanBase集群,…

代码随想录算法训练营第三十六天| 435.无重叠区间、763.划分字母区间、56.合并区间

系列文章目录 目录 系列文章目录435. 无重叠区间贪心算法按左边界排序(与【452. 用最少数量的箭引爆气球】思路差不多) 763.划分字母区间贪心算法①将字符串映射到哈希数组,用二维数组记录每个字母存在的区间, 转化为重叠区间问题…

手搓单链表(无哨兵位)(C语言)

目录 SLT.h SLT.c SLTtest.c 测试示例 单链表优劣分析 SLT.h #pragma once#include <stdio.h> #include <assert.h> #include <stdlib.h>typedef int SLTDataType;typedef struct SListNode {SLTDataType data;struct SListNode* next; }SLTNode;//打印…

数据治理和数据管理 傻傻分不清楚?

互联网时代&#xff0c;数据&#xff0c;这一无形资产&#xff0c;已成为现代企业的核心竞争力。如何高效地管理和利用数据&#xff0c;成为企业关注的焦点。在这个过程中&#xff0c;数据治理&#xff08;Data Governance&#xff09;和数据管理&#xff08;Data Management&a…

1分钟掌握 Python 函数参数

任何编程语言函数都是非常重要的一部分&#xff0c;而在进行函数调用时&#xff0c;了解函数的参数传递方式是非常有必要的。Python中支持哪些传参方式呢&#xff1f; Python中的传参方式是比较灵活的&#xff0c;主要包括以下六种&#xff1a; 按照位置传参按照关键字传参默…

【算法基础实验】图论-构建无向图

构建无向图 前提 JAVA实验环境 理论 无向图的数据结构为邻接表数组&#xff0c;每个数组中保存一个Bag抽象数据类型&#xff08;Bag类型需要专门讲解&#xff09; 实验数据 我们的实验数据是13个节点和13条边组成的无向图&#xff0c;由一个txt文件来保存&#xff0c;本…
最新文章