Просмотр исходного кода

外部渠道待处理记录的分页处理

wangyunpeng 1 месяц назад
Родитель
Сommit
894a4757aa

+ 3 - 2
api-module/src/main/java/com/tzld/piaoquan/api/dao/mapper/contentplatform/ExternalChannelMapperExt.java

@@ -15,12 +15,13 @@ public interface ExternalChannelMapperExt {
 
     /**
      * 查询待处理的记录列表(status=0)
-     * 仅查询创建时间在指定时间之后的记录
+     * 使用id大于lastId的方式分页查询,避免重复扫描
+     * @param lastId 上一页最后一条记录的id,首次传0
      * @param limit 查询条数限制
      * @param startTime 创建时间起始值
      * @return 待处理记录列表
      */
-    List<ExternalChannel> selectPendingList(@Param("limit") int limit, @Param("startTime") Date startTime);
+    List<ExternalChannel> selectPendingList(@Param("lastId") long lastId, @Param("limit") int limit, @Param("startTime") Date startTime);
 
     /**
      * 将创建时间早于指定时间的待处理记录标记为失败

+ 6 - 3
api-module/src/main/java/com/tzld/piaoquan/api/job/ExternalChannelProcessJob.java

@@ -134,14 +134,15 @@ public class ExternalChannelProcessJob {
                 log.info("已将{}条创建时间早于{}的记录标记为失败", failedCount, beforeDaysTime);
             }
 
-            // 1. 循环分页查询并处理待处理的记录(status=0),仅查询指定时间之后的记录
+            // 1. 循环分页查询并处理待处理的记录(status=0),使用id>lastId方式分页
             int totalProcessed = 0;
             int pageNum = 0;
+            long lastId = 0;
             List<ExternalChannel> pendingList;
 
             do {
                 pageNum++;
-                pendingList = externalChannelMapperExt.selectPendingList(QUERY_LIMIT, beforeDaysTime);
+                pendingList = externalChannelMapperExt.selectPendingList(lastId, QUERY_LIMIT, beforeDaysTime);
 
                 if (CollectionUtils.isEmpty(pendingList)) {
                     if (pageNum == 1) {
@@ -150,7 +151,9 @@ public class ExternalChannelProcessJob {
                     break;
                 }
 
-                log.info("第{}页, 找到{}条待处理记录", pageNum, pendingList.size());
+                // 更新lastId为本页最后一条记录的id
+                lastId = pendingList.get(pendingList.size() - 1).getId();
+                log.info("第{}页, 找到{}条待处理记录, lastId={}", pageNum, pendingList.size(), lastId);
 
                 // 2. 逐条处理
                 for (ExternalChannel record : pendingList) {

+ 2 - 1
api-module/src/main/resources/mapper/contentplatform/ext/ExternalChannelMapperExt.xml

@@ -30,8 +30,9 @@
         from external_channel
         where `status` = 0
         and is_delete = 0
+        and id > #{lastId}
         and create_time >= #{startTime}
-        order by create_time asc
+        order by id asc
         limit #{limit}
     </select>