多线程异步导出excel

先新建一个执行类

@Service
public class MultiService {
     private static final Logger logger = LoggerFactory.getLogger(MultiService .class);
     //创建一个线程池
     private ExecutorService executorService = Executors.newFixedThreadPool(10);    

    //导出结果列表的service,不是必须
    @Autowired
    private OemAsnyReportResultService oemAsnyReportResultService;

    // 数据来源的service
    @Autowired
    private CouponChannelStatisticService couponChannelStatisticService;

    public void couponStatisticExport(Map<String, Object> params) throws Exception {
        if (!params.containsKey("path") ) {
            //do something
            return;
        }

        //文件上传的路径
        String path = params.get("path").toString()
        // 异步导出
        executorService.execute(new KQChannelStatisticExport(oemAsnyReportResultService, couponChannelStatisticService, logger, params,path));
    }

}

 下面是要执行导出功能的线程

public class KQChannelStatisticExport implements Runnable {

     public KQChannelStatisticExport() {}

     public KQChannelStatisticExport(OemAsnyReportResultService oemAsnyReportResultService,
                    CouponChannelStatisticService couponChannelStatisticService, Logger logger, Map<String, Object> params,
                    String resourceServerPath) {
        this.oemAsnyReportResultService = oemAsnyReportResultService;
        this.couponChannelStatisticService = couponChannelStatisticService;this.logger = logger;
        this.params = params;
        this.resourceServerPath = resourceServerPath;
    }
 
    @Override
    public void run() {

    //执行导出excel的代码

//如果在这里获取session,有可能会报错【shiro报错There is no session with id [xxx] 】

//导出成功后可以在导出记录表新增一条记录
   oemAsnyReportResultService.save(); } }

 

 

创建一个controller

@Controller
public class KQChannelStatisticController{

    @Autowired
    private MultiService multiService ;

    /**
     * 统计导出
     */
    @RequestMapping("/exportKQChannelStatistic")
    @ResponseBody
    public Map<String, Object> exportKQChannelStatistic(HttpServletRequest request) {

    Map<String, Object> result = new HashMap<String, Object>();
        result.put("success", true);

    Map<String, Object> params = new HashMap<String, Object>();

    // 获取参数
    params = getStatParemMap(request);

    //这里是获取session里面的数据,写在controller里面防止报错,如果写在导出的线程中会报错【shiro报错There is no session with id [xxx] 】
    params = AsynExportExcelUtil.joinSonAccount(params);
    try {
       multiService.kqChannelStatisticExport(params);
    } catch (Exception e) {
       logger.error("统计数据导出异常", e);
       result.put("success", false);
    }
       return result;
    }
}

 

大概流程就是这样。。。。

 

posted @ 2016-07-14 12:21  乱码出黑客  阅读(6671)  评论(1编辑  收藏  举报