From c906c6c61648830b52aa759c0d2b83efc21c8c37 Mon Sep 17 00:00:00 2001 From: x_z Date: Fri, 21 Apr 2023 16:31:08 +0800 Subject: [PATCH] =?UTF-8?q?1.=E8=B0=83=E6=95=B4=E7=AC=AC=E4=B8=89=E6=96=B9?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=A4=9A=E7=BA=BF=E7=A8=8B?= =?UTF-8?q?=E7=8E=AF=E5=A2=83=E4=B8=8B=E5=8F=AF=E8=83=BD=E5=87=BA=E7=8E=B0?= =?UTF-8?q?=E7=9A=84=E6=95=B0=E6=8D=AE=E5=90=8C=E6=AD=A5=E9=97=AE=E9=A2=98?= =?UTF-8?q?=E5=92=8C=E6=A0=87=E8=AF=86=E6=9C=AA=E5=A4=8D=E4=BD=8D=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../thrsys/ThirdSysInterfaceExecuteVo.java | 2 +- .../glxp/api/task/ThirdSysInterfaceTask.java | 80 ++++++++++++------- 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/glxp/api/res/thrsys/ThirdSysInterfaceExecuteVo.java b/src/main/java/com/glxp/api/res/thrsys/ThirdSysInterfaceExecuteVo.java index 2a3e6640..c77eee82 100644 --- a/src/main/java/com/glxp/api/res/thrsys/ThirdSysInterfaceExecuteVo.java +++ b/src/main/java/com/glxp/api/res/thrsys/ThirdSysInterfaceExecuteVo.java @@ -23,6 +23,6 @@ public class ThirdSysInterfaceExecuteVo { /** * 任务是否执行完毕 */ - private boolean isFinished; + private boolean finished; } diff --git a/src/main/java/com/glxp/api/task/ThirdSysInterfaceTask.java b/src/main/java/com/glxp/api/task/ThirdSysInterfaceTask.java index 5cb05089..a190b23d 100644 --- a/src/main/java/com/glxp/api/task/ThirdSysInterfaceTask.java +++ b/src/main/java/com/glxp/api/task/ThirdSysInterfaceTask.java @@ -20,10 +20,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutorService; @@ -35,13 +32,13 @@ import java.util.concurrent.ExecutorService; @Component public class ThirdSysInterfaceTask { - private ExecutorService executor; - /** * redis key 前缀 */ private static final Map> keyMap = new ConcurrentHashMap<>(5); + private volatile ExecutorService executor; + /** * 获取执行任务的线程池 * @@ -49,8 +46,10 @@ public class ThirdSysInterfaceTask { */ private ExecutorService getExecutor() { if (null == executor) { - log.info("初始化第三方系统接口执行线程池"); - executor = ThreadUtil.newExecutor(10, 100, Integer.MAX_VALUE); + synchronized (this) { + log.info("初始化第三方系统接口执行线程池"); + executor = ThreadUtil.newExecutor(10, 100, Integer.MAX_VALUE); + } } return executor; } @@ -70,7 +69,7 @@ public class ThirdSysInterfaceTask { @Resource private IoOrderService orderService; - @Scheduled(fixedRate = 60 * 1000, initialDelay = 60 * 1000) + @Scheduled(fixedRate = 20 * 1000, initialDelay = 60 * 1000) public void scanInterface() { log.info("开始扫描自动执行的第三方接口列表"); List list = thrSystemDetailDao.selectAutoExecuteList(); @@ -118,8 +117,13 @@ public class ThirdSysInterfaceTask { if (verifyTask(thrSystemDetailEntity)) { getExecutor().submit(() -> { log.info("开始提交单据到第三方系统"); - orderService.submitOrderToThrSys(thrSystemDetailEntity); - updateTask(getTaskKey(thrSystemDetailEntity)); + try { + orderService.submitOrderToThrSys(thrSystemDetailEntity); + } catch (Exception e) { + log.error("提交单据到第三方系统异常", e); + } finally { + updateTask(getTaskKey(thrSystemDetailEntity)); + } log.info("提交单据到第三方系统完成"); }); } @@ -135,8 +139,13 @@ public class ThirdSysInterfaceTask { if (verifyTask(thrSystemDetailEntity)) { getExecutor().submit(() -> { log.info("开始下载第三方单据类型"); - thrBusTypeOriginService.downloadThrBusType(thrSystemDetailEntity); - updateTask(getTaskKey(thrSystemDetailEntity)); + try { + thrBusTypeOriginService.downloadThrBusType(thrSystemDetailEntity); + } catch (Exception e) { + log.error("下载第三方单据类型异常", e); + } finally { + updateTask(getTaskKey(thrSystemDetailEntity)); + } log.info("第三方单据类型下载完成"); }); } @@ -152,8 +161,13 @@ public class ThirdSysInterfaceTask { if (verifyTask(thrSystemDetailEntity)) { getExecutor().submit(() -> { log.info("开始下载第三方产品信息"); - thrProductsService.downloadThrPi(thrSystemDetailEntity); - updateTask(getTaskKey(thrSystemDetailEntity)); + try { + thrProductsService.downloadThrPi(thrSystemDetailEntity); + } catch (Exception e) { + log.error("下载第三方产品信息异常", e); + } finally { + updateTask(getTaskKey(thrSystemDetailEntity)); + } log.info("第三方产品信息下载完成"); }); } @@ -169,8 +183,13 @@ public class ThirdSysInterfaceTask { if (verifyTask(thrSystemDetailEntity)) { getExecutor().submit(() -> { log.info("开始下载第三方往来单位信息"); - thrCorpService.downloadThrCorp(thrSystemDetailEntity); - updateTask(getTaskKey(thrSystemDetailEntity)); + try { + thrCorpService.downloadThrCorp(thrSystemDetailEntity); + } catch (Exception e) { + log.error("下载第三方往来单位异常", e); + } finally { + updateTask(getTaskKey(thrSystemDetailEntity)); + } log.info("第三方往来单位信息下载完成"); }); } @@ -186,8 +205,14 @@ public class ThirdSysInterfaceTask { if (verifyTask(thrSystemDetailEntity)) { getExecutor().submit(() -> { log.info("开始下载第三方仓库信息"); - thrInvWarehouseService.downloadThrInv(thrSystemDetailEntity); - updateTask(getTaskKey(thrSystemDetailEntity)); + try { + thrInvWarehouseService.downloadThrInv(thrSystemDetailEntity); + } catch (Exception e) { + log.error("下载第三方仓库信息异常", e); + } finally { + //保证任务标识一定会被修改回去 + updateTask(getTaskKey(thrSystemDetailEntity)); + } log.info("第三方仓库信息下载完成"); }); } @@ -216,17 +241,14 @@ public class ThirdSysInterfaceTask { if (null != vo && !vo.isFinished()) { log.info("有任务尚未执行完成,当前任务key:{}", taskKey); return false; - } else { - if (vo == null) { - vo = new ThirdSysInterfaceExecuteVo(); - vo.setKey(taskKey); - } - vo.setNextTime(DateUtil.offsetMonth(new Date(), thrSystemDetailEntity.getTime()).getTime()); - vo.setFinished(false); - - redisUtil.set(taskKey, vo); - return true; } + long nextTime = DateUtil.offsetMonth(new Date(), thrSystemDetailEntity.getTime()).getTime(); + vo = Optional.ofNullable(vo).orElse(new ThirdSysInterfaceExecuteVo()); + vo.setKey(taskKey); + vo.setNextTime(nextTime); + vo.setFinished(false); + redisUtil.set(taskKey, vo); + return true; } /**