文档章节

Spring 4 @Async 实例

你要爪子
 你要爪子
发布于 2014/12/19 23:15
字数 394
阅读 141
收藏 0

#Spring 4 @Async 实例

这里写一个简单的示例来说明 Spring 异步任务的 @Async 注解使用;

##看下我们的依赖关系

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.0.3.RELEASE</version>
</dependency>

##在例子中,我们会用到注解,看下我们的 spring.xml 文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            http://www.springframework.org/schema/context/spring-context-4.0.xsd
            http://www.springframework.org/schema/task
            http://www.springframework.org/schema/task/spring-task-4.0.xsd">

    <context:annotation-config />
    <context:component-scan base-package="osuya.example"/>

    <task:annotation-driven />

    <bean class="osuya.example.Spring4Tasks" name="spring4Tasks"></bean>
</beans>

这个配置文件中,最主要的就是 task的命名空间以及这句 <task:annotation-driven /> 这告诉spring扫描我们项目中 使用 @Async 和 @Scheduled 的注解

##首先我们创建 @Service

>NormalService + NormalServiceImpl
>ASyncService + ASyncServiceImpl

##ASyncServiceImpl实现类:

package osuya.example;

import java.util.concurrent.Future;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.AsyncResult;
import org.springframework.stereotype.Service;

@Service
public class ASyncServiceImpl implements ASyncService {

    @Autowired NormalService normalService;

    @Async
    @Override
    public Future<Boolean> async() {

        // Demonstrate that our beans are being injected
        System.out.println("Managed bean injected: " + (normalService != null));

        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("I'm done!");

        return new AsyncResult<Boolean>(true);
    }

}

可以看到,在这个异步方法中,我们使用了 @Async 并且返回了 AsyncResult。

##现在我们来看看他是怎么工作的:

package osuya.example;

import java.util.concurrent.Future;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Spring4Tasks {

    @Autowired ASyncService asyncService;

    @Autowired NormalService normalService;

    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("/spring.xml");
        Spring4Tasks app = context.getBean(Spring4Tasks.class);
        app.start();
        System.exit(0);
    }

    public void start() {
        normalService.notAsync();

        Future<Boolean> result = asyncService.async();

        for(int i = 0; i < 5; i++) normalService.notAsync();

        while(!result.isDone()){
            // we wait
        }
    }
}

##输出结果:

Not in a thread

Not in a thread

Not in a thread

Not in a thread

Not in a thread

Not in a thread

Managed bean injected: true

I'm done!

© 著作权归作者所有

你要爪子
粉丝 25
博文 92
码字总数 44444
作品 0
昆明
高级程序员
私信 提问
透过现象看原理:详解 Spring 中 Bean 的 this 调用导致 AOP 失效的原因

原文出处:光闪 前言 在我们使用Spring时,可能有前辈教导过我们,在bean中不要使用this来调用被@Async、@Transactional、@Cacheable等注解标注的方法,this下注解是不生效的。 那么大家可曾...

光闪
2018/05/16
0
0
Springboot @Async 异步方法

Springboot @Async 异步方法 1.异步调用 异步调用就是在不阻塞主线程的情况下执行高耗时方法 2.常规异步 通过开启新线程实现 3.在Springboot中启用异步方法 需要4个注解 @EnableAsync 开启异...

qq_15071263
2018/05/02
0
0
聊聊TaskExecutor的spring托管

序 本文主要简述下如何设置TaskExecutor的Thread.UncaughtExceptionHandler。 实例 使用spring托管TaskExecutor的好处就是可以在spring容器启动或销毁的时候做些准备或清理动作。分别可以用i...

go4it
2017/10/31
42
0
Spring @Async/@Transactional 失效的原因及解决方案

本来上一篇说要写关于AOP的实践的,但是这周刚好遇到了使用@Transactional和@Async的不生效的问题,这篇就进行一个回顾和记录。 之前提到实现AOP的方法有动态代理、编译期,类加载期织入等等...

陶源0111
2018/06/25
0
0
线程池中使用ThreadLocal方案

人工手打,翻译自:https://moelholm.com/2017/07/24/spring-4-3-using-a-taskdecorator-to-copy-mdc-data-to-async-threads本来想自己写一篇关于线程池threadlocal的,偶然看到这篇文章觉得...

whaon
2018/12/07
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

Replugin借助“UI进程”来快速释放Dex

public static boolean preload(PluginInfo pi) { if (pi == null) { return false; } // 借助“UI进程”来快速释放Dex(见PluginFastInstallProviderProxy的说明) return PluginFastInsta......

Gemini-Lin
今天
4
0
Hibernate 5 的模块/包(modules/artifacts)

Hibernate 的功能被拆分成一系列的模块/包(modules/artifacts),其目的是为了对依赖进行独立(模块化)。 模块名称 说明 hibernate-core 这个是 Hibernate 的主要(main (core))模块。定义...

honeymoose
今天
4
0
CSS--属性

一、溢出 当内容多,元素区域小的时候,就会产生溢出效果,默认是纵向溢出 横向溢出:在内容和容器之间再套一层容器,并且内部容器要比外部容器宽 属性:overflow/overflow-x/overflow-y 取值...

wytao1995
今天
4
0
精华帖

第一章 jQuery简介 jQuery是一个JavaScript库 jQuery具备简洁的语法和跨平台的兼容性 简化了JavaScript的操作。 在页面中引入jQuery jQuery是一个JavaScript脚本库,不需要特别的安装,只需要...

流川偑
今天
7
0
语音对话英语翻译在线翻译成中文哪个方法好用

想要进行将中文翻译成英文,或者将英文翻译成中文的操作,其实有一个非常简单的工具就能够帮助完成将语音进行翻译转换的软件。 在应用市场或者百度手机助手等各大应用渠道里面就能够找到一款...

401恶户
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部