PatentQueueService.java 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package cn.cslg.pas.service.importPatent;
  2. import cn.cslg.pas.domain.business.ImportTask;
  3. import cn.cslg.pas.service.business.ImportTaskService;
  4. import lombok.RequiredArgsConstructor;
  5. import org.springframework.stereotype.Service;
  6. import java.util.ArrayList;
  7. import java.util.Date;
  8. import java.util.List;
  9. import java.util.concurrent.locks.Condition;
  10. import java.util.concurrent.locks.Lock;
  11. import java.util.concurrent.locks.ReentrantLock;
  12. /**
  13. * 导入专利所需的各队列和线程
  14. *
  15. * @author chenyu
  16. * @date 2023/10/20
  17. */
  18. @Service
  19. @RequiredArgsConstructor
  20. public class PatentQueueService {
  21. private final ImportTaskService importTaskService;
  22. private final ImportPatentFactory importPatentFactory;
  23. private final List<Integer> importTaskQueue = new ArrayList<>();
  24. private final Lock importTaskLock = new ReentrantLock();
  25. private final Condition importTaskCondition = importTaskLock.newCondition();
  26. /**
  27. * 从任务队列取出并执行任务
  28. */
  29. public void excuteTask() {
  30. while (true) {
  31. ImportTask importTask = new ImportTask();
  32. try {
  33. //判断任务队列是否有任务,若没有则线程等待唤醒
  34. if (importTaskQueue.size() == 0) {
  35. importTaskLock.lock();
  36. importTaskCondition.await();
  37. }
  38. //线程被唤醒后 ↓
  39. if (importTaskQueue.size() > 0) {
  40. //从任务队列中取出第一个任务,同时将其从任务队列中剔除
  41. importTask = importTaskService.getById(importTaskQueue.remove(0));
  42. //判断任务状态,若不存在/已完成/已暂停/已取消,则跳过继续取下一个任务
  43. if (importTask == null || importTask.getState().equals(2) || importTask.getState().equals(4) || importTask.getState().equals(5)) {
  44. continue;
  45. }
  46. //TODO 调用工厂方法
  47. ImportPatentImp imp = importPatentFactory.getClass(importTask.getId());
  48. //执行导入专利方法
  49. imp.startImport(importTask);
  50. }
  51. } catch (Exception e) {
  52. e.printStackTrace();
  53. //导入任务表更新数据(导入状态完成、完成时间)
  54. importTask.setState(2);
  55. importTask.setFinishTime(new Date());
  56. importTaskService.updateById(importTask);
  57. }
  58. }
  59. }
  60. /**
  61. * 唤醒生产者线程
  62. */
  63. public void awakeTasktch() {
  64. if (importTaskLock.tryLock()) {
  65. //taskLock.lock();
  66. importTaskCondition.signalAll();
  67. importTaskLock.unlock();
  68. }
  69. }
  70. /**
  71. * 添加导入专利任务到任务队列
  72. *
  73. * @param importTaskIds 任务ids
  74. */
  75. public void addImportTasksToQueue(List<Integer> importTaskIds) {
  76. importTaskQueue.addAll(importTaskIds);
  77. }
  78. }