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


前言

在原生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由线程池中的线程负责执行。


总结

回到顶部

相关推荐

  1. 23spring-async(异步)

    2024-04-27 09:24:01       36 阅读
  2. Spring Boot中异步线程池@Async

    2024-04-27 09:24:01       45 阅读
  3. spring异步@Async方法request丢失的问题处理

    2024-04-27 09:24:01       31 阅读
  4. 27spring-spel进阶版

    2024-04-27 09:24:01       22 阅读
  5. Spring异步注解@Async的使用及其自定义线程池配置

    2024-04-27 09:24:01       40 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 09:24:01       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 09:24:01       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 09:24:01       87 阅读
  4. Python语言-面向对象

    2024-04-27 09:24:01       96 阅读

热门阅读

  1. 【华为OD机试】手机App防沉迷系统【C卷|100分】

    2024-04-27 09:24:01       32 阅读
  2. [C#]C# break和continue关键字

    2024-04-27 09:24:01       29 阅读
  3. 解决 Oracle 表锁

    2024-04-27 09:24:01       30 阅读
  4. spring的CacheManager

    2024-04-27 09:24:01       34 阅读
  5. Vue rules动态控制是否校验

    2024-04-27 09:24:01       36 阅读
  6. 龙芯中标麒麟安装pyqt和运行项目主程序

    2024-04-27 09:24:01       37 阅读
  7. 4-用户权限控制(后端)

    2024-04-27 09:24:01       33 阅读
  8. 采用公共云计算有助于减轻环境影响吗?

    2024-04-27 09:24:01       32 阅读
  9. 【Flutter 面试题】 Dart 当中的 .. 表示什么?

    2024-04-27 09:24:01       34 阅读