当前位置: 首页 > news >正文

@EnableAsync和@Async开始异步任务支持

Spring通过任务执行器(TaskExecutor)来实现多线程和并发编程。使用ThreadPoolTaskExecutor可实现一个基于线程池的TaskExecutor.在开发中实现异步任务,我们可以在配置类中添加@EnableAsync开始对异步任务的支持,并在相应的方法中使用@Async注解来声明一个异步任务。
配置类

package com.xingguo.logistics.controller;

import java.util.concurrent.Executor;

import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
@ComponentScan({"com.xingguo.logistics.service.aspect","com.xingguo.logistics.service.event"})
//开始异步支持
@EnableAsync
public class AopConfig implements AsyncConfigurer{

    @Override
    public Executor getAsyncExecutor() {
         //线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(25);
        taskExecutor.initialize();
        return taskExecutor;
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
         return null;
    }

}

任务执行service类

package com.xingguo.logistics.service.aspect;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class TestService2 {

    //声明异步任务
    @Async
    public void executeAsyncTask(Integer i){
         System.out.println("执行异步任务:"+i);
    }

    @Async
    public void executeAsyncTask2(Integer i){
         System.out.println("执行异步任务2:"+i);
    }

}<

测试类

package com.xingguo.logistics.controller;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import com.xingguo.logistics.service.aspect.TestService2;

public class TestController {

public static void main(String[] args) {
    AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AopConfig.class);

    TestService2 testService2 = context.getBean(TestService2.class);
    for(int i = 0; i<10; i++){
        testService2.executeAsyncTask(i);
        testService2.executeAsyncTask2(i);
    }
    context.close();

    }
}

测试结果如下:
这里写图片描述
执行结果可以看出,并没有按照顺序来执行。

相关文章:

  • Jenkins+Kubernetes CI/CD
  • YARN中内存的设置
  • 责任链模式 以及在Android开发中的运用
  • 学习打卡-2018/08/07
  • Micro Service Architecture — Timeout
  • 通用清除浮动方式
  • Struts2之校验
  • python基础库
  • 逻辑回归最小二乘推导
  • Emgu-WPF 激光雷达研究-移动物体跟踪
  • 浅谈OSI七层模型之物理层
  • 详述 IntelliJ IDEA 插件的安装及使用方法
  • python3 之__str__
  • CentOS Peer's Certificate has expired 问题
  • Golang dep包管理器
  • C学习-枚举(九)
  • input实现文字超出省略号功能
  • isset在php5.6-和php7.0+的一些差异
  • js如何打印object对象
  • MySQL QA
  • Python连接Oracle
  • React Native移动开发实战-3-实现页面间的数据传递
  • react-native 安卓真机环境搭建
  • vue自定义指令实现v-tap插件
  • yii2中session跨域名的问题
  • 程序员该如何有效的找工作?
  • 机器学习中为什么要做归一化normalization
  • 你不可错过的前端面试题(一)
  • 数据科学 第 3 章 11 字符串处理
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 交换综合实验一
  • 整理一些计算机基础知识!
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (arch)linux 转换文件编码格式
  • (Java)【深基9.例1】选举学生会
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (一)eclipse Dynamic web project 工程目录以及文件路径问题
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转)我也是一只IT小小鸟
  • .net mvc 获取url中controller和action
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • @html.ActionLink的几种参数格式
  • @软考考生,这份软考高分攻略你须知道
  • [ai笔记9] openAI Sora技术文档引用文献汇总
  • [ARC066F]Contest with Drinks Hard
  • [BZOJ 2142]礼物(扩展Lucas定理)
  • [C++随笔录] 红黑树
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法