SpringBoot + MyBatis + Oracle + Druid 实现异步任务
你猜
阅读:649
2021-03-31 13:28:16
评论:0
业务场景:公司有A和B 两个Oralce 数据库,需要进行数据迁移,迁移的数据量预估在十万级左右
功能分析:数据迁移项目需要支持以下功能:多数据源配置、分页查询和异步插入(异步任务)
实现方式一:同步方式(不推荐)
实现方式二:异步方式之线程池
controller
/**
* 异步处理1:线程池,创建新线程处理
* @return
*/
@RequestMapping(value = "/asyn",method = RequestMethod.GET)
public String asyn(){
ExecutorService service = Executors.newFixedThreadPool(5);
RunnableTask1 task1 = new RunnableTask1();
service.execute(task1);
logger.info("=========》当前线程名:"+Thread.currentThread().getName());
return "异步,正在解析......";
}
任务线程
public class RunnableTask1 implements Runnable{
private final Logger logger = LoggerFactory.getLogger(getClass());
@Override
public void run(){
synchronized (this){
try {
/**省略迁移业务逻辑代码**/
}catch (Exception ex){
ex.printStackTrace();
}
}
}
}
实现方式三:SpringBoot自身的一种异步方式,使用注解实现,非常方便,我们在想要异步执行的方法上加上@Async注解,在controller上加上@EnableAsync,即可。
注意,这里的异步方法,只能在自身之外调用,在本类调用是无效的
package com.zzg.controller.asyn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.zzg.common.AbstractController;
import com.zzg.controller.ConstructionProjectController;
import com.zzg.service.asyn.AsynService;
/**
* 异步任务:A库-->B库
* @author zzg
*
*/
@Controller
@RequestMapping("/api/asyn")
@EnableAsync //启动SpringBoot 异步任务机制
public class AsynTaskController extends AbstractController {
// 日志记录
public static final Logger log = LoggerFactory.getLogger(ConstructionProjectController.class);
@Autowired
AsynService asynService;
/**
* 异步任务迁移一
*/
@RequestMapping("/one")
public void one() {
log.warn("----开始执行数据迁移异步任务----");
asynService.asynTaskOne();
log.warn("----结束执行数据迁移异步任务----");
}
/**
* 异步任务迁移二
*/
@RequestMapping("/two")
public void two() {
log.warn("----开始执行数据迁移异步任务----");
asynService.asynTaskTwo();
log.warn("----结束执行数据迁移异步任务----");
}
}
总结:推荐使用第三种方式实现异步任务处理。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。