SpringBoot + MyBatis + Oracle + Druid 实现异步任务解析

你猜 阅读:218 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.作者投稿可能会经我们编辑修改或补充。

发表评论
搜索
排行榜
KIKK导航

KIKK导航

关注我们