Ver Fonte

Merge remote-tracking branch 'origin/package' into package

zhangxianyu há 3 meses atrás
pai
commit
98ddae5726

+ 1 - 1
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/ManageApplication.java

@@ -23,7 +23,7 @@ public class ManageApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(ManageApplication.class, args);
-        System.out.println("赞象Manage服务启动成功 < (IP解析历史数据处理调试 ・・)ノ(._.`) \n" +
+        System.out.println("赞象Manage服务启动成功 < (IP解析历史数据处理新增线程池调试 ・・)ノ(._.`) \n" +
                 "___  ___  ___   _   _   ___  _____  _____ \n" +
                 "|  \\/  | / _ \\ | \\ | | / _ \\|  __ \\|  ___|\n" +
                 "| .  . |/ /_\\ \\|  \\| |/ /_\\ \\ |  \\/| |__  \n" +

+ 9 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/controller/UserController.java

@@ -166,6 +166,15 @@ public class UserController {
         return ResultVO.ok();
     }
 
+    @ApiOperation(value = "根据主键id解析数据IP")
+    @PatchMapping(value = "/ip/assay/by/ids")
+    @PreAuthorize(permissionKey = "manage:user:ipAssay")
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "成功")})
+    public ResultVO<Void> userIpAssayById(@RequestParam String ids) {
+        ipDataAssayService.userHandleByIds(ids);
+        return ResultVO.ok();
+    }
+
     @ApiOperation(value = "玩家登录日志数据IP解析")
     @PatchMapping(value = "/login/log/ip/assay")
     @PreAuthorize(permissionKey = "manage:user:loginLogIpAssay")

+ 7 - 0
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/IIpDataAssayService.java

@@ -9,6 +9,13 @@ import java.util.List;
  */
 public interface IIpDataAssayService {
 
+    /**
+     * 根据主键id处理
+     *
+     * @param ids : 主键id
+     */
+    void userHandleByIds(String ids);
+
     /**
      * 用户表处理
      */

+ 81 - 28
game-module/game-module-manage/src/main/java/com/zanxiang/game/module/manage/service/impl/IpDataAssayServiceImpl.java

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.github.sd4324530.jtuple.Tuple3;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import com.zanxiang.erp.base.ErpServer;
 import com.zanxiang.erp.base.pojo.vo.SysIpv4RpcVO;
 import com.zanxiang.erp.base.rpc.ISysIpv4Rpc;
@@ -23,8 +24,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -48,6 +53,34 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
     @Autowired
     private IUserLoginLogService userLoginLogService;
 
+    private static final ThreadPoolExecutor THREAD_POOL_IP_DATA_ASSAY = new ThreadPoolExecutor(
+            10,
+            10,
+            0,
+            TimeUnit.MINUTES,
+            new LinkedBlockingQueue<>(),
+            new ThreadFactoryBuilder()
+                    .setNameFormat("sync-ipDataAssay-%d").build());
+
+    @Override
+    public void userHandleByIds(String ids) {
+        List<Long> userIds = Arrays.stream(ids.split(",")).map(Long::valueOf).collect(Collectors.toList());
+        List<User> userList = userService.listByIds(userIds);
+        if (CollectionUtils.isEmpty(userList)) {
+            return;
+        }
+        userList.forEach(user -> {
+            String ipData = this.ipAssay(user.getIp());
+            log.error("IP解析返回的结果, ipData : {}", ipData);
+            if (Strings.isBlank(ipData)) {
+                return;
+            }
+            userService.update(new LambdaUpdateWrapper<User>()
+                    .set(User::getIpData, ipData)
+                    .eq(User::getId, user.getId()));
+        });
+    }
+
     @Override
     public void userHandle(long supperGameId) {
         long page = 1L;
@@ -61,35 +94,45 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
             log.error("查询游戏列表列表为空");
             return;
         }
+        List<User> userList;
         do {
             Page<User> pageUser = userService.page(new Page<>(page, pageSize), new LambdaQueryWrapper<User>()
                     .select(User::getId, User::getIp, User::getIpData)
                     .in(User::getGameId, gameIdList)
                     .orderByDesc(User::getCreateTime));
             totalPage = pageUser.getPages();
-            List<User> userList = pageUser.getRecords();
-            log.error("当前执行页, page : {}, total : {}, size : {}", page, totalPage, userList.size());
-            userList.forEach(user -> {
-                if (Strings.isNotBlank(user.getIpData())) {
-                    return;
-                }
-                String ipData = this.ipAssay(user.getIp());
-                if (Strings.isBlank(ipData)) {
-                    log.error("IP解析结果返回为空, ip : {}", user.getIp());
-                    return;
-                }
-                userService.update(new LambdaUpdateWrapper<User>()
-                        .set(User::getIpData, ipData)
-                        .eq(User::getId, user.getId()));
-            });
+            userList = pageUser.getRecords();
+            log.error("用户执行页, page : {}, totalPage : {}, size : {}", page, totalPage, userList.size());
+            this.pageUserHandle(userList);
         } while (++page <= totalPage);
     }
 
+    private void pageUserHandle(List<User> userList) {
+        if (CollectionUtils.isEmpty(userList)) {
+            log.error("用户单页数据为空, 不处理");
+            return;
+        }
+        THREAD_POOL_IP_DATA_ASSAY.execute(() -> userList.forEach(user -> {
+            if (Strings.isNotBlank(user.getIpData())) {
+                return;
+            }
+            String ipData = this.ipAssay(user.getIp());
+            if (Strings.isBlank(ipData)) {
+                log.error("用户IP解析结果返回为空, ip : {}", user.getIp());
+                return;
+            }
+            userService.update(new LambdaUpdateWrapper<User>()
+                    .set(User::getIpData, ipData)
+                    .eq(User::getId, user.getId()));
+        }));
+    }
+
     @Override
     public void userLoginLogHandle() {
         long page = 1L;
         long pageSize = 5000L;
         long totalPage;
+        List<UserLoginLog> userLoginLogList;
         do {
             Page<UserLoginLog> pageUserLoginLog = userLoginLogService.page(new Page<>(page, pageSize),
                     new LambdaQueryWrapper<UserLoginLog>()
@@ -97,22 +140,32 @@ public class IpDataAssayServiceImpl implements IIpDataAssayService {
                             .ge(UserLoginLog::getCreateTime, LocalDateTime.now().minusMonths(2))
                             .orderByDesc(UserLoginLog::getCreateTime));
             totalPage = pageUserLoginLog.getPages();
-            List<UserLoginLog> userLoginLogList = pageUserLoginLog.getRecords();
-            userLoginLogList.forEach(userLoginLog -> {
-                if (Strings.isNotBlank(userLoginLog.getIpData())) {
-                    return;
-                }
-                String ipData = this.ipAssay(userLoginLog.getIp());
-                if (Strings.isBlank(ipData)) {
-                    return;
-                }
-                userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
-                        .set(UserLoginLog::getIpData, ipData)
-                        .eq(UserLoginLog::getId, userLoginLog.getId()));
-            });
+            userLoginLogList = pageUserLoginLog.getRecords();
+            log.error("登录日志执行页, page : {}, totalPage : {}, size : {}", page, totalPage, userLoginLogList.size());
+            this.pageUserLoginLogHandle(userLoginLogList);
         } while (++page <= totalPage);
     }
 
+    private void pageUserLoginLogHandle(List<UserLoginLog> userLoginLogList) {
+        if (CollectionUtils.isEmpty(userLoginLogList)) {
+            log.error("登录日志单页数据为空, 不处理");
+            return;
+        }
+        THREAD_POOL_IP_DATA_ASSAY.execute(() -> userLoginLogList.forEach(userLoginLog -> {
+            if (Strings.isNotBlank(userLoginLog.getIpData())) {
+                return;
+            }
+            String ipData = this.ipAssay(userLoginLog.getIp());
+            if (Strings.isBlank(ipData)) {
+                log.error("登录日志IP解析结果返回为空, ip : {}", userLoginLog.getIp());
+                return;
+            }
+            userLoginLogService.update(new LambdaUpdateWrapper<UserLoginLog>()
+                    .set(UserLoginLog::getIpData, ipData)
+                    .eq(UserLoginLog::getId, userLoginLog.getId()));
+        }));
+    }
+
     @Override
     public void ipDataHandle(List<String> msgList) {
         msgList.forEach(msg -> {