spring 的 @Async 异步任务配置 及事务的说明

最近涉及到了一些spring的异步任务的了解,虽然我没去写相关的代码,不过还是去了解了很多,此处做一些记录。

spring异步任务配置

在spring的配置文件之中,增加task的配置,包含相关的约束的引用和相关的设置。
具体如下:在xmlns中添加task,在xsi中加入具体的约束地址。增加

 xmlns:task="http://www.springframework.org/schema/task"

 xsi:schemaLocation=http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.0.xsd

增加task的配置,这里可能有小伙伴配置过spring定时就会发现,配置是一个,其也确实是一个,看了下约束,里面说的很清楚,是给定时的注释和异步任务的注释使用的。

Enables the detection of @Async and @Scheduled annotations on any Spring-managed
object.

<task:annotation-driven executor="threadPoolTaskExecutor" />

这里说明下,连接池是自己配置的,因为有别的需求,官方的说明如下:

Specifies the java.util.Executor instance to use when invoking asynchronous methods.
If not provided, an instance of org.springframework.core.task.SimpleAsyncTaskExecutor
will be used by default.

然后具体的连接池配置如下:

 <bean id="threadPoolTaskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
    <!--核心线程数,默认为1 -->
    <property name="corePoolSize" value="10" />
    <!--最大线程数,默认为Integer.MAX_VALUE-->
    <property name="maxPoolSize" value="50" />
    <!--队列最大长度,一般需要设置值>=notifyScheduledMainExecutor.maxNum;默认为Integer.MAX_VALUE-->
    <property name="queueCapacity" value="1000" /> 
    <!--线程池维护线程所允许的空闲时间,默认为60s-->
    <property name="keepAliveSeconds" value="300" />
    <!-- 线程池对拒绝任务(无线程可用)的处理策略,目前只支持AbortPolicy、CallerRunsPolicy;默认为后者-->
    <property name="rejectedExecutionHandler">
        <!-- AbortPolicy:直接抛出java.util.concurrent.RejectedExecutionException异常-->
        <!-- CallerRunsPolicy:主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度-->
        <!-- DiscardOldestPolicy:抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行-->
        <!-- DiscardPolicy:抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行-->
        <bean class="java.util.concurrent.ThreadPoolExecutor$CallerRunsPolicy" />
    </property>
    <!-- 线程关闭策略,默认false,当值为true时,只有当子线程里面的任务完成时才会调用shutdown()来关闭现场 -->
    <property name="waitForTasksToCompleteOnShutdown" value="true" />
</bean>

到这里,配置方面已经说清楚了,下面说下使用吧。

spring异步任务执行

使用很简单 ,在service里面,需要异步执行的方法,添加@Async这个注释即可,,这个任务就会异步执行。
代码如下:

@Service
public class TestServiceImpl implements TestService {

@Async
@Override
public void runTheTest(){
        System.out.println("执行11111");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println("执行22222");
    }    
}

spring异步任务的事务

说到事务就毕竟麻烦,之前网上查了一下,说不能直接在这个异步任务里面直接加事务,需要引用其他service里面的加事务。项目本身是aop来进行事务的管理,然后再service里面引入了两个其他的service。
代码入下:

@Service
public class TestServiceImpl implements TestService {

@Autowired
private BigDataMessageService bigDataMessageService;

private SqCoursewareService sqCoursewareService;

@Async
@Override
public void runTheTest(){
        System.out.println("执行11111");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    List<WarningMessage> messageList = new ArrayList<WarningMessage>();
    WarningMessage a = new WarningMessage();
    a.setUnitId("999");
    a.setUserId("000");
    a.setCreationTime(new Date());
    a.setMessage("999000");
    a.setType(1);
    a.setResult("000999");
    messageList.add(a);
    bigDataMessageService.insertWarningMessage(messageList);
    sqCoursewareService.selectByPrimaryKey(1);
}
}

这里第二个service实际没有注入,所以运行实际这个方法会报空指针异常。首先屏蔽掉 sqCoursewareService.selectByPrimaryKey(1);
这个方法,结果正常插入。
之后解除屏蔽,抛出了空指针异常,同时插入的数据被回滚。

本身单个没有引用有事务的service,测试结果实际也是被回滚了。
代码如下:

@Service
public class TestServiceImpl implements TestService {

@Autowired
private BigDataMessageMapper bigDataMessageMapper;

@Async
@Override
public void runTheTest(){
        System.out.println("执行11111");
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    List<WarningMessage> messageList = new ArrayList<WarningMessage>();
    WarningMessage a = new WarningMessage();
    a.setUnitId("991");
    a.setUserId("001");
    a.setCreationTime(new Date());
    a.setMessage("991001");
    a.setType(1);
    a.setResult("001991");
    messageList.add(a);
    bigDataMessageMapper.insertWarningMessage(messageList);
    Integer.valueOf(testFunction());
    System.out.println("执行222222");
}

private String testFunction(){
    return null;
}

}

这里直接引入Mapper,Mapper实际是没有事务的,然后
Integer.valueOf(testFunction());
这里会抛异常,结果是插入同样被回滚了。

也许网上说的情况和我测试的不一致,也许是spring版本的原因,这里时间有限没有进一步的测试了。小伙伴如果知道是哪里有问题可以告诉我下,然后写的话,尽量本身不要涉及事务,然后引用的service里面加上事务吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,502评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,680评论 6 342
  • 1.cookie cookie分为两种: ①以文件的方式存储在硬盘空间上的长期性的cookie:比如登录时填写的一...
    overflow_hidden阅读 273评论 0 2
  • 感恩锦明老师的爱不完的课程和紫雨老师的阿拉神灯书,感恩群里的智慧父母们的分享,我又学到了好多好多以前没有学过的东西...
    戴智英_六中换_醉美瑜伽阅读 428评论 4 8
  • 我回首前尘往事,犯下重罪的小笨蛋,我想跟他沟通让他明白,但我办不到,那个少年早就不见了,只剩下我垂老之躯。
    Wuli_小君阅读 494评论 0 0