Spring中的异步任务
为什么80%的码农都做不了架构师?>>>
问题
项目中需要异步调用第三方服务,不需要关心是否调用成功。之前在文章《Spring task的异步定时任务》中使用的xml配置Spring Task的方式,而且之前是依靠时间触发异步的方式。这次在Spring boot项目中配置Spring Task,并且以代码直接调用异步方法的方式触发异步。
解决
配置异步
package com.zyl;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import java.util.concurrent.Executor;@SpringBootApplication
@EnableAsync
public class Application {public static void main(String[] args) {// close the application context to shut down the custom ExecutorServiceSpringApplication.run(Application.class, args).close();}@Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(2);executor.setMaxPoolSize(2);executor.setQueueCapacity(500);executor.setThreadNamePrefix("Message-");executor.initialize();return executor;}}
这里主要在Application.java类中,做了2处配置,一个是增加@EnableAsync
注解,告诉Spring需要启用异步任务;二是添加了一个Bean,这个Bean主要就是配置异步调用的线程池的初始化参数。
model层
package com.zyl.model;import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;import javax.persistence.*;
import java.util.Date;@Entity
public class Message {@Id@GeneratedValue(strategy = GenerationType.AUTO)@ApiModelProperty(notes = "主键", example = "0")private long id;/** 消息id */private String messageId;/** 消息标题 */private String messageTitle;/** 消息内容 */@Lob private String message;/** 发送人员 */private String uid;/** 发送时间 */@JsonFormat private Date sendTime;/** 消息结果 */@Lob private String messageResult;public long getId() {return id;}public void setId(long id) {this.id = id;}public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public Date getSendTime() {return sendTime;}public void setSendTime(Date sendTime) {this.sendTime = sendTime;}public String getMessageResult() {return messageResult;}public void setMessageResult(String messageResult) {this.messageResult = messageResult;}public String getMessageId() {return messageId;}public void setMessageId(String messageId) {this.messageId = messageId;}public String getMessageTitle() {return messageTitle;}public void setMessageTitle(String messageTitle) {this.messageTitle = messageTitle;}
}
这主要就是一个简单的Java Bean。
Service层
Service接口定义
package com.zyl.service;import com.zyl.model.Message;
import org.springframework.scheduling.annotation.Async;import java.util.Optional;public interface IMessageService {/*** 推送一条消息* @param message 消息*/@Asyncvoid pushMessage(Message message);
}
IMessageService是Service的接口定义。
Service接口实现
package com.zyl.service;import com.fasterxml.jackson.databind.ObjectMapper;
import com.hngytobacco.budget.model.Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;import java.util.Optional;@Service
public class MessageService implements IMessageService {private static final Logger logger = LoggerFactory.getLogger(MessageService.class);@Async@Overridepublic void pushMessage(Message message) {logger.info("开始推送消息异步任务");try {// 模拟调用第三方推送消息接口延时Thread.sleep(1000L);} catch (InterruptedException e) {e.printStackTrace();}logger.info("完成推送消息异步任务");}}
MessageService是Service接口的具体实现,这里主要就是配置了@Async
的异步注解,告诉Spring这是个异步方法,没有配置时间的方式触发。
Controller层
package com.zyl.controller;import com.zyl.model.*;
import com.zyl.service.*;
import io.swagger.annotations.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;@RestController
@RequestMapping(value = "/message")
public class MessageController {private Logger logger = LoggerFactory.getLogger(MessageController.class);private final IMessageService messageService;@Autowiredpublic BusinessController( IMessageService messageService) {this.messageService = messageService;}@GetMapping("/push")public ResponseEntity pushMessage(){Message message = new Message();logger.info("开始调用消息推送");messageService.pushMessage(message);logger.info("完成调用消息推送");return ResponseEntity.ok().build();}
}
效果
2019-05-09 16:10:58.429 INFO 28215 --- [nio-8081-exec-3] c.zyl.controller.MessageController : 开始调用消息推送
2019-05-09 16:10:58.432 INFO 28215 --- [nio-8081-exec-3] c.zyl.controller.MessageController : 完成调用消息推送
2019-05-09 16:10:58.432 INFO 28215 --- [ Message-1] c.zyl.service.MessageService : 开始推送消息异步任务
2019-05-09 16:10:59.435 INFO 28215 --- [ Message-1] c.zyl.service.MessageService : 完成推送消息异步任务
参考
- Creating Asynchronous Methods
- 7. Task Execution and Scheduling
转载于:https://my.oschina.net/fxtxz2/blog/3047539
Spring中的异步任务相关推荐
- Spring5源码解析-Spring中的异步事件
上一篇 Spring框架中的事件和监听器并未对Spring框架中的异步事件涉及太多,所以本篇是对其一个补充. 同步事件有一个主要缺点:它们在所调用线程的本地执行(也就是将所调用线程看成主线程的话,就是 ...
- Spring中的异步和事务性事件侦听器
内置的事件发布功能从Spring的早期版本开始存在,对于处理同一应用程序上下文中Spring组件之间的基本通信仍然有用. 通常,应用程序可以生成应用程序事件(可以是任意对象)并侦听它们. 整个机制非常 ...
- spring mvc 异步_DeferredResult – Spring MVC中的异步处理
spring mvc 异步 DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContex ...
- DeferredResult – Spring MVC中的异步处理
DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContext异步请求处理. 简要介绍一 ...
- Spring中解决事务以及异步注解失效
Spring中解决事务以及异步注解失效 一.重现@Transaction失效的场景 有如下业务场景,新增订单后,自动发送短信,下面的代码在同一个类中: @Transaction public void ...
- Spring中异步注解@Async的使用、原理及使用时可能导致的问题
前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...
- Spring中事务提交成功后处理的异步调用方法
为什么80%的码农都做不了架构师?>>> 问题 想要在Spring中提交事务成功后,调用一部分异步方法. 解决 TransactionSynchronizationManage ...
- Spring Boot 中的异步调用
Spring Boot 中的异步调用 通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行.而异步编程则没有这个限制,代码的 ...
- Spring Boot 中启用异步调用
在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行. 在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可 ...
最新文章
- 2018年爱奇艺校招笔试
- 【PAT (Basic Level) 】1024 科学计数法 (20 分)
- Android端的短视频开发技术
- 架构师进阶之独孤九剑:设计模式详解
- 微信号承载私域流量的9条心得
- 我的世界物品java修改代码大全,我的世界秘籍_物品代码秘籍中文大全_蚕豆网攻略...
- logback.xml日志文件常用配置模板文件详解
- JSSE Java与SSL
- 【Excel】数据的输入
- 珀莱雅:融资净买入201.72万元,融资余额2.52亿元
- 将代码提交到github上
- MySQL关系运算和连接运算,数据库的关系运算和完整性约束
- 银行数字化转型导师坚鹏:数字化转型背景下的银行对公客户营销
- 关于mirro多仓库配置的一些问题
- 在主窗口中打开一个子窗口,主窗口和子窗口怎么传递参数?
- Rook Ceph浅谈
- 掌握正确的运动姿势,很有必要!
- java后台Controller下载文件方法
- 通过Url访问服务器的文件
- 西南大学计算机研究生就业好嘛,西南大学2018毕业生就业结果:就业率为 89.45%,最高月薪7600...
热门文章
- java获取文件的所有者_java获取文件夹下所有文件的名称 | 星尘
- linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
- 行业操作系统行业深度报告 华为鸿蒙系统,操作系统行业深度报告:华为鸿蒙系统、安卓和未来.docx...
- TensorFlow 强制使用CPU
- Python基础之标准库datetime 时间与日期的使用
- 二十一、二分查找算法(递归非递归)
- 操作系统 进程调度-银行家算法实验报告
- 人脸检测--SSH: Single Stage Headless Face Detector
- 人群分析--Beyond Counting: Comparisons of Density Maps for Crowd Analysis Tasks
- 湖北孝感计算机职称考试,2015湖北职称计算机考试报名:孝感职称计算机报名入口...