From 0553d847853cf5579ac91381fd1981f63725cff0 Mon Sep 17 00:00:00 2001 From: xiangpei <xiangpei@timesnew.cn> Date: 星期六, 03 八月 2024 14:38:49 +0800 Subject: [PATCH] 平台在线率表、定时任务ping、同步 --- ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java | 40 +++++ ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java | 17 ++ ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java | 34 ++++ ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java | 32 ++++ ycl-server/src/main/java/com/ycl/task/PlatformTask.java | 116 ++++++++++++++++ ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml | 55 +++++++ ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java | 53 +++++++ ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java | 48 ++++++ ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java | 18 ++ 9 files changed, 413 insertions(+), 0 deletions(-) diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java new file mode 100644 index 0000000..712abdc --- /dev/null +++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/entity/PlatformOnline.java @@ -0,0 +1,40 @@ +package com.ycl.platform.domain.entity; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import java.time.LocalDate; +import java.util.Date; + +import com.ycl.platform.base.AbsEntity; +import lombok.Data; + +/** + * 骞冲彴鍦ㄧ嚎鐜� + * + * @author xp + * @since 2024-08-03 + */ +@Data +@TableName("t_platform_online") +public class PlatformOnline extends AbsEntity { + + private static final long serialVersionUID = 1L; + + @TableField("platform_name") + /** 骞冲彴鍚嶇О */ + private String platformName; + + @TableField("platform_ip") + /** 骞冲彴ip/鍩熷悕 */ + private String platformIp; + + @TableField("create_date") + /** 缁熻鐨勬棩鏈� */ + private Date createDate; + + @TableField("today_outline_sed") + /** 浠婃棩绂荤嚎鏃堕暱/绉� */ + private Integer todayOutlineSed; + + +} diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java new file mode 100644 index 0000000..3516566 --- /dev/null +++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/query/PlatformOnlineQuery.java @@ -0,0 +1,17 @@ +package com.ycl.platform.domain.query; + +import com.ycl.platform.base.AbsQuery; +import io.swagger.annotations.ApiModel; +import lombok.Data; + +/** + * 骞冲彴鍦ㄧ嚎鐜囨煡璇� + * + * @author xp + * @since 2024-08-03 + */ +@Data +@ApiModel(value = "PlatformOnline鏌ヨ", description = "骞冲彴鍦ㄧ嚎鐜囨煡璇�") +public class PlatformOnlineQuery extends AbsQuery { +} + diff --git a/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java new file mode 100644 index 0000000..381b8a0 --- /dev/null +++ b/ycl-pojo/src/main/java/com/ycl/platform/domain/vo/PlatformOnlineVO.java @@ -0,0 +1,48 @@ +package com.ycl.platform.domain.vo; + +import com.ycl.platform.base.AbsVo; +import com.ycl.platform.domain.entity.PlatformOnline; +import org.springframework.lang.NonNull; +import org.springframework.beans.BeanUtils; +import lombok.Data; +import java.util.Date; + +/** + * 骞冲彴鍦ㄧ嚎鐜囧睍绀� + * + * @author xp + * @since 2024-08-03 + */ +@Data +public class PlatformOnlineVO extends AbsVo { + + /** 骞冲彴鍚嶇О */ + private String platformName; + + /** 骞冲彴ip/鍩熷悕 */ + private String platformIp; + + /** 缁熻鐨勬棩鏈� */ + private Date createDate; + + /** 浠婃棩绂荤嚎鏃堕暱/绉� */ + private Integer todayOutlineSed; + + /** 褰撳墠鏄惁鍦ㄧ嚎 */ + private Boolean currentOnline; + + /** */ + private Date updateTime; + + /** */ + private Date createTime; + + public static PlatformOnlineVO getVoByEntity(@NonNull PlatformOnline entity, PlatformOnlineVO vo) { + if(vo == null) { + vo = new PlatformOnlineVO(); + } + BeanUtils.copyProperties(entity, vo); + return vo; + } + +} diff --git a/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java b/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java index f7e36e5..7f8a7bb 100644 --- a/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java +++ b/ycl-server/src/main/java/com/ycl/platform/controller/DataCenterController.java @@ -1,9 +1,13 @@ package com.ycl.platform.controller; import com.ycl.platform.domain.query.DataCenterQuery; +import com.ycl.platform.domain.query.PlatformOnlineQuery; import com.ycl.platform.service.DataCenterService; +import com.ycl.platform.service.PlatformOnlineService; import com.ycl.system.Result; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,6 +24,20 @@ public class DataCenterController { private final DataCenterService dataCenterService; + private final PlatformOnlineService platformOnlineService; + + /** + * 骞冲彴鍦ㄧ嚎鐜� + * + * @param query + * @return + */ + @GetMapping("/platformOnlineRate") + @ApiOperation(value = "骞冲彴鍦ㄧ嚎鐜�", notes = "骞冲彴鍦ㄧ嚎鐜�") + @PreAuthorize("hasAuthority('platformOnline:page')") + public Result platformOnlineRate(DataCenterQuery query) { + return platformOnlineService.page(query); + } /** * 瑙嗛锛氱偣浣嶅湪绾跨巼 diff --git a/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java b/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java new file mode 100644 index 0000000..24bf22f --- /dev/null +++ b/ycl-server/src/main/java/com/ycl/platform/mapper/PlatformOnlineMapper.java @@ -0,0 +1,34 @@ +package com.ycl.platform.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import com.ycl.platform.domain.entity.PlatformOnline; +import com.ycl.platform.domain.query.DataCenterQuery; +import com.ycl.platform.domain.query.PlatformOnlineQuery; +import com.ycl.platform.domain.vo.PlatformOnlineVO; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +/** + * 骞冲彴鍦ㄧ嚎鐜� Mapper 鎺ュ彛 + * + * @author xp + * @since 2024-08-03 + */ +@Mapper +public interface PlatformOnlineMapper extends BaseMapper<PlatformOnline> { + + /** + * id鏌ユ壘骞冲彴鍦ㄧ嚎鐜� + * @param id + * @return + */ + PlatformOnlineVO getById(Integer id); + + /** + * 鍒嗛〉 + */ + IPage getPage(IPage page, @Param("query") DataCenterQuery query); + +} diff --git a/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java b/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java new file mode 100644 index 0000000..7f86c2d --- /dev/null +++ b/ycl-server/src/main/java/com/ycl/platform/service/PlatformOnlineService.java @@ -0,0 +1,32 @@ +package com.ycl.platform.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.ycl.platform.domain.entity.PlatformOnline; +import com.ycl.platform.domain.query.DataCenterQuery; +import com.ycl.platform.domain.query.PlatformOnlineQuery; +import com.ycl.system.Result; + +import java.util.List; + +/** + * 骞冲彴鍦ㄧ嚎鐜� 鏈嶅姟绫� + * + * @author xp + * @since 2024-08-03 + */ +public interface PlatformOnlineService extends IService<PlatformOnline> { + + /** + * 鎵归噺鍒犻櫎 + * @param ids + * @return + */ + Result remove(List<String> ids); + + /** + * 鍒嗛〉鏌ヨ + * @param query + * @return + */ + Result page(DataCenterQuery query); +} diff --git a/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java b/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java new file mode 100644 index 0000000..94d1a88 --- /dev/null +++ b/ycl-server/src/main/java/com/ycl/platform/service/impl/PlatformOnlineServiceImpl.java @@ -0,0 +1,53 @@ +package com.ycl.platform.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.ycl.platform.domain.entity.PlatformOnline; +import com.ycl.platform.domain.query.DataCenterQuery; +import com.ycl.platform.domain.vo.PlatformOnlineVO; +import com.ycl.platform.mapper.PlatformOnlineMapper; +import com.ycl.platform.service.PlatformOnlineService; +import com.ycl.system.Result; +import com.ycl.system.page.PageUtil; +import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +/** + * 骞冲彴鍦ㄧ嚎鐜� 鏈嶅姟瀹炵幇绫� + * + * @author xp + * @since 2024-08-03 + */ +@Service +@RequiredArgsConstructor +public class PlatformOnlineServiceImpl extends ServiceImpl<PlatformOnlineMapper, PlatformOnline> implements PlatformOnlineService { + + private final PlatformOnlineMapper platformOnlineMapper; + + /** + * 鎵归噺鍒犻櫎 + * @param ids + * @return + */ + @Override + public Result remove(List<String> ids) { + baseMapper.deleteBatchIds(ids); + return Result.ok("鍒犻櫎鎴愬姛"); + } + + /** + * 鍒嗛〉鏌ヨ + * @param query + * @return + */ + @Override + public Result page(DataCenterQuery query) { + Page<PlatformOnlineVO> page = new Page<>(query.getPageNum(), query.getPageSize()); + baseMapper.getPage(page, query); + return Result.ok().data(page.getRecords()).total(page.getTotal()); + } + +} diff --git a/ycl-server/src/main/java/com/ycl/task/PlatformTask.java b/ycl-server/src/main/java/com/ycl/task/PlatformTask.java new file mode 100644 index 0000000..e0ed630 --- /dev/null +++ b/ycl-server/src/main/java/com/ycl/task/PlatformTask.java @@ -0,0 +1,116 @@ +package com.ycl.task; + +import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper; +import com.ycl.platform.domain.entity.PlatformOnline; +import com.ycl.platform.service.PlatformOnlineService; +import com.ycl.system.entity.SysDictData; +import com.ycl.system.service.impl.SysDictTypeServiceImpl; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.io.IOException; +import java.net.InetAddress; +import java.util.Date; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; + +/** + * 骞冲彴鍦ㄧ嚎鐜囧畾鏃朵换鍔� + * + * @author锛歺p + * @date锛�2024/8/3 13:26 + */ +@Slf4j +@RequiredArgsConstructor +@Component("platformTask") +public class PlatformTask { + + private final RedisTemplate redisTemplate; + private final SysDictTypeServiceImpl dictTypeService; + private final PlatformOnlineService platformOnlineService; + + /** + * 璇ュ畾鏃朵换鍔¢渶瑕佷娇鐢╮edis瀛樺偍绂荤嚎鏃堕暱锛屽苟瀹氭湡鍚屾鍒癿ysql涓� + */ + private static final String REDIS_KEY_PREFIX = "platform_online_"; + + private static final String DICT_TYPE = "platform_online"; + + private static final ExecutorService executorService = new ThreadPoolExecutor(8, + 24, + 5000, + TimeUnit.SECONDS, + new ArrayBlockingQueue<>(10), + new ThreadPoolExecutor.CallerRunsPolicy() + ); + + /** + * ping骞冲彴鏄惁鍦ㄧ嚎 + * + * @throws IOException + */ + public void ping() { + List<SysDictData> platformList = dictTypeService.selectDictDataByType(DICT_TYPE); + for (SysDictData platform : platformList) { + executorService.submit(() -> { + try { + Boolean reachable = Boolean.FALSE; + for (int tryTimes = 1; tryTimes < 3; tryTimes++) { + // 涓夌鏈猵ing閫氶噸璇曚竴娆★紝濡傛灉涓嶈鎵嶆墸鍒� + reachable = InetAddress.getByName(platform.getDictValue()).isReachable(3000); + if (! reachable && tryTimes == 0) { + continue; + } + if (! reachable) { + // 濡傛灉ping涓嶉�氾紝绂荤嚎鏃堕暱鍔�5绉� + redisTemplate.opsForValue().increment(REDIS_KEY_PREFIX + platform.getDictValue(), 5); + log.warn(platform.getDictLabel() + "骞冲彴鏈猵ing閫�"); + } + } + } catch (Exception e) { + log.error("妫�鏌ュ钩鍙拌繛閫氭�ф椂鍙戠敓閿欒", e); + } + }); + } + } + + /** + * 姣忓皬鏃跺皢redis涓殑骞冲彴绂荤嚎鏁版嵁鍚屾鍒癿ysql + * + */ + public void synToMySQL() { + List<SysDictData> platformList = dictTypeService.selectDictDataByType(DICT_TYPE); + // 灏唈ava.util.Date杞崲涓簀ava.sql.Date + java.sql.Date sqlDate = new java.sql.Date(new Date().getTime()); + + for (SysDictData platform : platformList) { + Object outLineTime = redisTemplate.opsForValue().get(REDIS_KEY_PREFIX + platform.getDictValue()); + Integer outlineTimeSed = Objects.isNull(outLineTime) ? 0 : (Integer) outLineTime; + PlatformOnline one = new LambdaQueryChainWrapper<>(platformOnlineService.getBaseMapper()) + .eq(PlatformOnline::getPlatformIp, platform.getDictValue()) + .eq(PlatformOnline::getCreateDate, sqlDate) + .one(); + if (Objects.isNull(one)) { + one = new PlatformOnline(); + one.setPlatformIp(platform.getDictValue()); + one.setPlatformName(platform.getDictLabel()); + one.setCreateDate(sqlDate); + one.setTodayOutlineSed(outlineTimeSed); + } else { + one.setTodayOutlineSed(one.getTodayOutlineSed() + outlineTimeSed); + } + one.setPlatformIp(platform.getDictValue()); + one.setPlatformName(platform.getDictLabel()); + one.setCreateDate(sqlDate); + + platformOnlineService.saveOrUpdate(one); + } + log.info("鍚屾骞冲彴绂荤嚎淇℃伅瀹屾垚"); + } +} diff --git a/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml b/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml new file mode 100644 index 0000000..94c67ad --- /dev/null +++ b/ycl-server/src/main/resources/mapper/zgyw/PlatformOnlineMapper.xml @@ -0,0 +1,55 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<mapper namespace="com.ycl.platform.mapper.PlatformOnlineMapper"> + + <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 --> + <resultMap id="BaseResultMap" type="com.ycl.platform.domain.vo.PlatformOnlineVO"> + <result column="platform_name" property="platformName" /> + <result column="platform_ip" property="platformIp" /> + <result column="create_date" property="createDate" /> + <result column="today_outline_sed" property="todayOutlineSed" /> + <result column="update_time" property="updateTime" /> + <result column="create_time" property="createTime" /> + </resultMap> + + + + + + + + <select id="getById" resultMap="BaseResultMap"> + SELECT + TPO.platform_name, + TPO.platform_ip, + TPO.create_date, + TPO.today_outline_sed, + TPO.update_time, + TPO.create_time, + TPO.id + FROM + t_platform_online TPO + WHERE + TPO.id = #{id} AND TPO.deleted = 0 + </select> + + + <select id="getPage" resultMap="BaseResultMap"> + SELECT + TPO.platform_name, + TPO.platform_ip, + TPO.create_date, + TPO.today_outline_sed, + TPO.update_time, + TPO.create_time, + TPO.id + FROM + t_platform_online TPO + WHERE + TPO.deleted = 0 + <if test="query.startTime != null and query.endTime != null"> + AND TPO.create_date between #{query.startTime} and #{query.endTime} + </if> + </select> + +</mapper> -- Gitblit v1.8.0