为什么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中的异步任务相关推荐

  1. Spring5源码解析-Spring中的异步事件

    上一篇 Spring框架中的事件和监听器并未对Spring框架中的异步事件涉及太多,所以本篇是对其一个补充. 同步事件有一个主要缺点:它们在所调用线程的本地执行(也就是将所调用线程看成主线程的话,就是 ...

  2. Spring中的异步和事务性事件侦听器

    内置的事件发布功能从Spring的早期版本开始存在,对于处理同一应用程序上下文中Spring组件之间的基本通信仍然有用. 通常,应用程序可以生成应用程序事件(可以是任意对象)并侦听它们. 整个机制非常 ...

  3. spring mvc 异步_DeferredResult – Spring MVC中的异步处理

    spring mvc 异步 DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContex ...

  4. DeferredResult – Spring MVC中的异步处理

    DeferredResult是一个可能尚未完成的计算的容器,它将在将来提供. Spring MVC使用它来表示异步计算,并利用Servlet 3.0 AsyncContext异步请求处理. 简要介绍一 ...

  5. Spring中解决事务以及异步注解失效

    Spring中解决事务以及异步注解失效 一.重现@Transaction失效的场景 有如下业务场景,新增订单后,自动发送短信,下面的代码在同一个类中: @Transaction public void ...

  6. Spring中异步注解@Async的使用、原理及使用时可能导致的问题

    前言 最近,很多同学碰到了下面这个问题,添加了Spring提供的一个异步注解@Async循环依赖无法被解决了,下面是一些读者的留言跟群里同学碰到的问题: 本着讲一个知识点就要讲明白.讲透彻的原则,我决 ...

  7. Spring中事务提交成功后处理的异步调用方法

    为什么80%的码农都做不了架构师?>>>    问题 想要在Spring中提交事务成功后,调用一部分异步方法. 解决 TransactionSynchronizationManage ...

  8. Spring Boot 中的异步调用

    Spring Boot 中的异步调用 通常我们开发的程序都是同步调用的,即程序按照代码的顺序一行一行的逐步往下执行,每一行代码都必须等待上一行代码执行完毕才能开始执行.而异步编程则没有这个限制,代码的 ...

  9. Spring Boot 中启用异步调用

    在Java中一般开发程序都会同步调用的,程序中代码是一行一行执行下去的,每一行代码需要等待上一行代码执行完成才能开始执行. 在异步编程中,代码执行不是阻塞的,在方法调用中不需要等待所有代码执行完毕就可 ...

最新文章

  1. 2018年爱奇艺校招笔试
  2. 【PAT (Basic Level) 】1024 科学计数法 (20 分)
  3. Android端的短视频开发技术
  4. 架构师进阶之独孤九剑:设计模式详解
  5. 微信号承载私域流量的9条心得
  6. 我的世界物品java修改代码大全,我的世界秘籍_物品代码秘籍中文大全_蚕豆网攻略...
  7. logback.xml日志文件常用配置模板文件详解
  8. JSSE Java与SSL
  9. 【Excel】数据的输入
  10. 珀莱雅:融资净买入201.72万元,融资余额2.52亿元
  11. 将代码提交到github上
  12. MySQL关系运算和连接运算,数据库的关系运算和完整性约束
  13. 银行数字化转型导师坚鹏:数字化转型背景下的银行对公客户营销
  14. 关于mirro多仓库配置的一些问题
  15. 在主窗口中打开一个子窗口,主窗口和子窗口怎么传递参数?
  16. Rook Ceph浅谈
  17. 掌握正确的运动姿势,很有必要!
  18. java后台Controller下载文件方法
  19. 通过Url访问服务器的文件
  20. 西南大学计算机研究生就业好嘛,西南大学2018毕业生就业结果:就业率为 89.45%,最高月薪7600...

热门文章

  1. java获取文件的所有者_java获取文件夹下所有文件的名称 | 星尘
  2. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证
  3. 行业操作系统行业深度报告 华为鸿蒙系统,操作系统行业深度报告:华为鸿蒙系统、安卓和未来.docx...
  4. TensorFlow 强制使用CPU
  5. Python基础之标准库datetime 时间与日期的使用
  6. 二十一、二分查找算法(递归非递归)
  7. 操作系统 进程调度-银行家算法实验报告
  8. 人脸检测--SSH: Single Stage Headless Face Detector
  9. 人群分析--Beyond Counting: Comparisons of Density Maps for Crowd Analysis Tasks
  10. 湖北孝感计算机职称考试,2015湖北职称计算机考试报名:孝感职称计算机报名入口...