Bläddra i källkod

v2.1 上线版本

lifuquan 1 år sedan
förälder
incheckning
93e9f4950e

+ 13 - 0
README.md

@@ -1 +1,14 @@
 # dingtalk_auto
+
+## 版本说明
+
+### v2.1 20230731
+
+1. 修复了在文件未正常生成时检查文件是否存在时在执行几次后就会卡住的bug;
+    - 原因是使用的任务编排CompletableFuture在重新调用时会阻塞原线程并从线程池获取一个新的线程,存在线程池占满全部阻塞的风险
+    - 当前暂时修改为使用默认的无上限的ForkJoinPool线程池执行。
+
+### v2.0
+
+1. 移植了投诉率的发送任务
+2. 实现了网络大脑0流量的发送任务

+ 1 - 1
doc/接口测试.md

@@ -5,7 +5,7 @@
 - 手动发送 零流量低流量明细
 
 ```http
-POST http://127.0.0.1:11111/dingtalk-auto/task/zerotraffic/send HTTP/1.1
+POST http://192.168.31.182:11111/dingtalk-auto/task/zerotraffic/send HTTP/1.1
 Content-Type:application/json
 
 2023-06

+ 1 - 1
pom.xml

@@ -6,7 +6,7 @@
 
     <groupId>com.nokia</groupId>
     <artifactId>dingtalk_auto</artifactId>
-    <version>2.0</version>
+    <version>2.1</version>
 
     <packaging>jar</packaging>
 

+ 16 - 11
src/main/java/com/nokia/dingtalk_auto/service/TslTaskService.java

@@ -16,15 +16,17 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 import org.springframework.stereotype.Service;
 
 import com.nokia.common.dingtalk.DingtalkUtil;
 import com.nokia.common.ssh.SftpUtil;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
  * 投诉清单各地市投诉率
  */
+@Slf4j
 @Service
 public class TslTaskService {
 
@@ -56,9 +58,6 @@ public class TslTaskService {
     @Autowired
     private MessageService messageService;
 
-    @Autowired
-    private ThreadPoolTaskScheduler taskScheduler;
-
     /**
      * 定时任务
      */
@@ -68,8 +67,8 @@ public class TslTaskService {
         calendar.add(Calendar.DATE, -1);
         DateFormat format = new SimpleDateFormat("yyyyMMdd");
         String day = format.format(calendar.getTime());
-        // 30分钟检查一次
-        checkRemoteDirAndWaitForFileOk(day, 1000L * 60 * 30).thenRun(() -> {
+        // 60分钟检查一次
+        checkRemoteDirAndWaitForFileOk(day, 1000L * 60 * 60).thenRun(() -> {
             download(day);
         }).thenRun(() -> {
             try {
@@ -330,7 +329,7 @@ public class TslTaskService {
      * 
      * @param day 20230622 样式的表示月份的字符串
      */
-    private void download(String day) {
+    public void download(String day) {
         // 创建SftpUtil
         SftpUtil sftpUtil = getSftpUtil();
         String remotePath = remoteDir + day;
@@ -356,19 +355,24 @@ public class TslTaskService {
     /**
      * 检查文件是否存在,如果不存在等待milliseconds毫秒后重新检查,直到文件已存在
      * 
+     * 这种实现方式不推荐,存在一个会打开很多线程的问题,即每次检查失败都会打开一个新的线程继续检查
+     * 所以这里也无法使用固定线程数量的线程池
+     * 
      * @param day          20230719
      * @param milliseconds 毫秒数
      * @return
      */
+    @Deprecated
     private CompletableFuture<Void> checkRemoteDirAndWaitForFileOk(String day, Long milliseconds) {
         return CompletableFuture.runAsync(() -> {
             checkRemoteDir(day);
-        }, taskScheduler).handle((result, ex) -> {
+        }).handle((result, ex) -> {
             if (ex != null) {
                 String msg = ex.getMessage();
                 // 发现文件不存在
                 if (msg.endsWith("No such file")) {
                     // 发送提醒
+                    log.error("投诉清单各地市投诉率账期 " + day + " 文件未具备,请提醒生产方进行生产。");
                     messageService.error("投诉清单各地市投诉率账期 " + day + " 文件未具备,请提醒生产方进行生产。");
                     // 等待一段时间
                     sleep(milliseconds);
@@ -376,6 +380,7 @@ public class TslTaskService {
                     return checkRemoteDirAndWaitForFileOk(day, milliseconds).join();
                 }
                 // 其他异常不进行重试
+                log.error("投诉清单各地市投诉率检查 " + day + " 账期文件时发生异常:" + msg);
                 messageService.error("投诉清单各地市投诉率检查 " + day + " 账期文件时发生异常:" + msg);
                 // 重新抛出异常
                 throw new RuntimeException(ex.getMessage());
@@ -402,13 +407,13 @@ public class TslTaskService {
     /**
      * 检查文件是否存在
      * 
-     * @param month
+     * @param day 20230731 代表某一天的字符串
      * @return
      * @throws Exception
      */
-    private void checkRemoteDir(String month) {
+    private void checkRemoteDir(String day) {
         SftpUtil sftpUtil = getSftpUtil();
-        String remotePath = remoteDir + month;
+        String remotePath = remoteDir + day;
         try {
             // 连接到sftp服务器
             sftpUtil.connect();

+ 10 - 1
src/main/java/com/nokia/dingtalk_auto/service/ZeroTrafficTaskService.java

@@ -18,9 +18,12 @@ import org.springframework.stereotype.Service;
 import com.nokia.common.dingtalk.DingtalkUtil;
 import com.nokia.common.ssh.SftpUtil;
 
+import lombok.extern.slf4j.Slf4j;
+
 /**
  * 零流量低流量明细发送
  */
+@Slf4j
 @Service
 public class ZeroTrafficTaskService {
 
@@ -116,19 +119,24 @@ public class ZeroTrafficTaskService {
     /**
      * 检查文件是否存在,如果不存在等待milliseconds毫秒后重新检查,直到文件已存在
      * 
+     * 这种实现方式不推荐,存在一个会打开很多线程的问题,即每次检查失败都会打开一个新的线程继续检查
+     * 所以这里也无法使用固定线程数量的线程池
+     * 
      * @param month
      * @param milliseconds 毫秒数
      * @return
      */
+    @Deprecated
     private CompletableFuture<Void> checkRemoteDirAndWaitForFileOk(String month, Long milliseconds) {
         return CompletableFuture.runAsync(() -> {
             checkRemoteDir(month);
-        }, taskScheduler).handle((result, ex) -> {
+        }).handle((result, ex) -> {
             if (ex != null) {
                 String msg = ex.getMessage();
                 // 发现文件不存在
                 if (msg.endsWith("No such file")) {
                     // 发送提醒
+                    log.error("零流量低流量明细账期 " + month + " 文件未具备,请提醒生产方进行生产。");
                     messageService.error("零流量低流量明细账期 " + month + " 文件未具备,请提醒生产方进行生产。");
                     // 等待一段时间
                     sleep(milliseconds);
@@ -136,6 +144,7 @@ public class ZeroTrafficTaskService {
                     return checkRemoteDirAndWaitForFileOk(month, milliseconds).join();
                 }
                 // 其他异常不进行重试
+                log.error("零流量低流量明细检查 " + month + " 账期文件时发生异常:" + msg);
                 messageService.error("零流量低流量明细检查 " + month + " 账期文件时发生异常:" + msg);
                 // 重新抛出异常
                 throw new RuntimeException(ex.getMessage());

+ 26 - 5
src/main/resources/application.yml

@@ -2,6 +2,8 @@ server:
   port: 11111
 
 spring:
+  profiles:
+    active: dev
   redis:
     host: 127.0.0.1
     port: 6379
@@ -38,18 +40,37 @@ tsxt:
     # 王玉龙的机器人
     appkey: dingzj6ozs4wfzxthzen
     appSecret: f5tIy_k8jjIPdwBT0Uns9cSEbP47vTZcqmkAwMnH0cD_GM4cu26Zt18vjRbylBbz
-    # 李福全的机器人
-    # appkey: dingothmdq6opv6hjrm5
-    # appSecret: SeoyAwUnzFIFY4j4CX089HJ0i-pj1BIzByB3AZcnbCQaq94lZvazFpfEGGQwPznc
   # 投诉每日自动发送的日报表(省公司级别)配置
   tsl:
     # 王玉龙的群
     openConversationId: cide4nWtey1XgBmy7VFcsu3rA==
-    # 李福全的群
-    # openConversationId: cidcWmmFwduUTDB3G0vPNOldQ==
     remoteHost: 133.96.94.105
     remotePort: 22
     remoteUser: do
     remotePassword: Richr00t
     remoteDir: /data/report_auto/output/
     localDir: ./download/tsxt/tsl/
+
+---
+# dev
+spring:
+  profiles: dev
+tsxt:
+  dingtalk:
+    # 李福全的机器人
+    appkey: dingothmdq6opv6hjrm5
+    appSecret: SeoyAwUnzFIFY4j4CX089HJ0i-pj1BIzByB3AZcnbCQaq94lZvazFpfEGGQwPznc
+  tsl:
+    # 李福全的群
+    openConversationId: cidcWmmFwduUTDB3G0vPNOldQ==
+    remoteHost: 192.168.31.10
+    remotePort: 22
+    remoteUser: lfq
+    remotePassword: Fantuan1985!
+    remoteDir: /home/lfq/
+    localDir: ./download/tsxt/tsl/
+
+---
+# pro
+spring:
+  profiles: pro

+ 0 - 4
src/main/resources/logback-spring.xml

@@ -53,11 +53,7 @@
     </appender>
     <root level="INFO">
         <appender-ref ref="STDOUT" />
-    </root>
-    <root level="TRACE">
         <appender-ref ref="TRACE_FILE" />
-    </root>
-    <root level="ERROR">
         <appender-ref ref="ERROR_FILE" />
     </root>
 </configuration>

+ 3 - 4
src/test/java/com/nokia/dingtalk_auto/DingtalkAutoApplicationTest.java

@@ -11,10 +11,9 @@ public class DingtalkAutoApplicationTest {
 
     @Autowired
     private TslTaskService tslTaskService;
-
+    
     @Test
-    void test() throws Exception {
-        tslTaskService.runTaskManually("20230718");
+    void test() {
+        tslTaskService.cronTask();
     }
-
 }