开发中遇到这样一个需求。导出excel可能会超时。所以需要做成异步下载。因为下载线程会比较占用cpu资源,可能会有一些慢sql,所以需要控制并发数。

1.建立一个堵塞链表队列,用来存在任务;

2.收到用户请求创建一个下载任务,放在任务队列中。

3.在web.xml中设置一个监听类,启动一个线程定时扫描任务队列,当有任务时执行任务。

4.在执行任务时设置FutureTask超时时间,堵塞当前线程,当前任务一直不结束时,终止任务运行,释放资源。

代码:

  1. <listener>
  2. <listener-class>com.taobao.kelude.k3case.listenners.ExportTaskStartupListener</listener-class>
  3. </listener>
  1. public class ExportTaskStartupListener implements ServletContextListener {
  2. @Override
  3. public void contextDestroyed(ServletContextEvent sce) {
  4. sce.getServletContext().log("定时器销毁");
  5. }
  6. @Override
  7. public void contextInitialized(ServletContextEvent sce) {
  8. sce.getServletContext().log("启动线程池");
  9. sce.getServletContext().log("启动定时器");
  10. sce.getServletContext().log("已经添加任务调度表");
  11. ExportTaskQueueThread exportTaskQueueThread = new ExportTaskQueueThread();
  12. exportTaskQueueThread.start();
  13. }
  14. }
  15. class ExportTaskQueueThread extends Thread {
  16. public void run() {
  17. System.out.println("init timer task");
  18. while (true) {
  19. // System.out.println("start timer task");
  20. try {
  21. if (!ExportTaskPoolManager.queue.isEmpty()) {
  22. CallableTask callableTask = ExportTaskPoolManager.queue.take();
  23. FutureTask futureTask = new FutureTask(callableTask);
  24. Thread thread = new Thread(futureTask);
  25. thread.start();
  26. try {
  27. futureTask.get(300, TimeUnit.SECONDS);
  28. } catch (TimeoutException e) {
  29. System.out.println("export failed for timeout");
  30. futureTask.cancel(true);
  31. }
  32. }
  33. Thread.sleep(10000);
  34. } catch (InterruptedException e) {
  35. e.printStackTrace();
  36. } catch (ExecutionException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }

 

  1. public class ExportTaskPoolManager {
  2. // public static ExecutorService pool;
  3. public static LinkedBlockingQueue<CallableTask> queue = new LinkedBlockingQueue<CallableTask>();
  4. }
  1. public class ExportCaseTask extends CallableTask {
  2. private Logger logger = LoggerFactory.getLogger("ExportCaseTask");
  3. private List<Integer> priority;
  4. private Integer userId;
  5. private Boolean needFormat;
  6. private Integer[] suiteIds;
  7. private List<Integer> caseIds;
  8. private List<Integer> spaceIds;
  9. private String name;
  10. private String type;
  11. public ExportCaseTask(Integer[] suiteIds, List<Integer> caseIds, List<Integer> spaceIds, String name, List<Integer> priority, String type,boolean needFormat, Integer userId) {
  12. this.needFormat = needFormat;
  13. this.priority = priority;
  14. this.userId = userId;
  15. this.suiteIds = suiteIds;
  16. this.caseIds = caseIds;
  17. this.spaceIds = spaceIds;
  18. this.name = name;
  19. this.type = type;
  20. }
  21. private TestCaseService testCaseService = (TestCaseService) SpringContextUtils.getBean("testCaseService");
  22. public Object call() throws Exception {
  23. try {
  24. testCaseService.generateASync(suiteIds, caseIds, spaceIds, name, priority, type, needFormat, userId);
  25. logger.info("generateASync ok");
  26. } catch (Exception e) {
  27. e.printStackTrace();
  28. } finally {
  29. }
  30. return 1;
  31. }
  32. }

 




版权声明:本文为myjavablog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/myjavablog/p/5992042.html