简单来说:
????????异步就相当于中午该吃饭了,你妈叫你吃饭,然后你说你不想吃,然后你妈不管你了,自己把饭吃了,管你啥时候吃。
举个简单的开发场景:
????????假如管理员要发布一条消息,但是呢通知的用户量超级大,执行起来就比较慢,所以就可以将通知用户的逻辑使用异步的方式进行修改。
@SpringBootApplication
@EnableAsync//开启异步任务支持
public class ApplicationStarter {
public static void main(String[] args) {
SpringApplication.run(ApplicationStarter.class,args);
}
}
@Configuration
public class ExcuterConfig {
/**
* 配置异步任务执行器
* @return 返回一个ThreadPoolExecutor对象,用于异步任务的执行
*/
@Bean(name = "myTaskExecutor")
public ThreadPoolExecutor getAsyncExecutor() {
// 创建一个ThreadPoolExecutor对象,用于执行异步任务
// 设置核心线程数为3,最大线程数为6,空闲线程60秒后被回收
// 使用LinkedBlockingDeque作为任务队列,最大容量为10000
return new ThreadPoolExecutor(3, 6, 60, TimeUnit.SECONDS, new LinkedBlockingDeque<>(10000));
}
}
@PostMapping("/addMessage")
public ResultInfo<String> addMessage(@RequestBody @Valid Message message) {
if (message == null) {
return new ResultInfo<String>().error("请传递message参数");
}
try {
long startTime = System.currentTimeMillis();
//添加消息到Message数据库
Integer messageId = messageService.addMessage(message);
if (messageId!=0) {
//异步新增数据到UserMessage库中
messageService.asyncBatchInsertUserMessage(messageId);
long endTime = System.currentTimeMillis();
System.out.println("同步执行时间:" + (endTime - startTime) + "毫秒");
return new ResultInfo<String>().succeed("新增消息成功");
} else {
return new ResultInfo<String>().error("新增消息失败");
}
} catch (Exception ex) {
logger.error("服务器异常,请稍后重试!" + ex.getMessage());
return new ResultInfo<String>().interrupt(ex.getMessage());
}
}
同步添加消息表
@Override
@Transactional
public Integer addMessage(Message message) {
try {
message.setNoticeTime(new Date());
long startTime = System.currentTimeMillis();
// 直接进行修改
messageMapper.addMessage(message);
// 应该对数据库中所有用户进行通知
// 保存后生成的自增长id
Integer messageId = message.getId();
System.out.println("新增消息的message_id:" + messageId);
return messageId;
} catch (Exception e) {
// 添加过程中发生异常,可以进行日志记录等操作
log.error("Error addMessage message: {}", e.getMessage(), e);
return 0;
}
}
异步添加用户信息表
@Override
@Async("myTaskExecutor")
public void asyncBatchInsertUserMessage(Integer messageId) {
try {
long startTime = System.currentTimeMillis();
List<Users> userList = userMapper.findAll();
// 批量插入UserMessage
if (!userList.isEmpty()) {
userMessageMapper.batchInsert(userList);
}
long endTime = System.currentTimeMillis();
System.out.println("异步执行时间:" + (endTime - startTime) + "毫秒");
System.out.println("异步执行");
} catch (Exception e) {
// 异常处理
log.error("异步发布消息给用户失败,对刚才发布的消息进行删除: {}", e.getMessage(), e);
messageMapper.deleteById(messageId);
}
}
这样就使用SpringBoot实现了一个简单的异步功能。