| @@ -0,0 +1,52 @@ | |||
| DROP TABLE IF EXISTS `sys_monitor`; | |||
| CREATE TABLE `sys_monitor` ( | |||
| `id` bigint(20) NOT NULL, | |||
| `name` varchar(50) NOT NULL COMMENT '网址名称', | |||
| `url` varchar(255) NOT NULL COMMENT '网址url', | |||
| `type` tinyint(20) DEFAULT '1' COMMENT '1=网址监控', | |||
| `deploy` tinyint(20) DEFAULT '1' COMMENT '1=dev 2=test 3=release', | |||
| `err_msg` varchar(50) DEFAULT NULL COMMENT '错误信息', | |||
| PRIMARY KEY (`id`), | |||
| UNIQUE `id_UNIQUE` USING BTREE (`id`) comment '' | |||
| ) ENGINE=`InnoDB` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='网络监控' CHECKSUM=0 DELAY_KEY_WRITE=0; | |||
| INSERT INTO `sys_monitor` (`id`,`name`,`url`,`type`,`deploy`,`err_msg`) VALUES | |||
| (1, "dev-管理端","https://mall.youlane.cn/api/version", 1, 1, "{url}不响应"), | |||
| (2, "dev-C端","https://ciformall.youlane.cn/C/api/mall/version", 1, 1, "{name}: {url} 不响应"), | |||
| (3, "dev-B端","https://biformall.youlane.cn/B/api/mall/version", 1, 1, "{name}: {url}不响应"), | |||
| (4, "dev-Schedule","http://202.165.179.86:5000/S/version", 1, 1, "{name}: {url}不响应"), | |||
| (5, "dev-消息服务器","http://202.165.179.86:5001/mq/version", 1, 1, "{name}: {url}不响应"), | |||
| (6, "dev-websocket服务器","http://202.165.179.86:7100/W/version", 1, 1, "{name}: {url}不响应"), | |||
| (7, "dev-微信第三方开放平台","https://open.youlane.cn/O/version", 1, 1, "{name}: {url}不响应"), | |||
| (8, "dev-移动端数据塔台","https://mobile.youlane.cn/#/", 1, 1, "{name}: {url}不响应"), | |||
| (9, "dev-幸运卡牌","https://game.youlane.cn/luckCard/index.html", 1, 1, "{name}: {url}不响应"), | |||
| (10, "dev-幸运砸金蛋","https://game.youlane.cn/goldEgg/index.html", 1, 1, "{name}: {url}不响应"), | |||
| (11, "dev-幸运刮刮乐","https://game.youlane.cn/guaguale/index.html", 1, 1, "{name}: {url}不响应"), | |||
| (12, "dev-callback","http://202.165.179.86:9100/version", 1, 1, "{name}: {url}不响应"), | |||
| (101, "test-管理端","https://admintest.malls.iformall.com/api/version", 1, 2, "{name}: {url}不响应"), | |||
| (102, "test-C端","https://ctest.malls.iformall.com/C/api/mall/version", 1, 2, "{name}: {url} 不响应"), | |||
| (103, "test-B端","https://btest.malls.iformall.com/B/api/mall/version", 1, 2, "{name}: {url}不响应"), | |||
| (104, "test-Schedule","https://stest.malls.iformall.com/S/version", 1, 2, "{name}: {url}不响应"), | |||
| (105, "test-消息服务器","https://stest.malls.iformall.com/mq/version", 1, 2, "{name}: {url}不响应"), | |||
| (106, "test-websocket服务器","https://stest.malls.iformall.com/W/version", 1, 2, "{name}: {url}不响应"), | |||
| (107, "test-微信第三方开放平台","https://opentest.malls.iformall.com/O/version", 1, 2, "{name}: {url}不响应"), | |||
| (108, "test-移动端数据塔台","https://mobiletest.malls.iformall.com/#/", 1, 2, "{name}: {url}不响应"), | |||
| (109, "test-幸运卡牌","https://gametest.malls.iformall.com/game/luckCard/index.html", 1, 2, "{name}: {url}不响应"), | |||
| (110, "test-幸运砸金蛋","https://gametest.malls.iformall.com/game/goldEgg/index.html", 1, 2, "{name}: {url}不响应"), | |||
| (111, "test-幸运刮刮乐","https://gametest.malls.iformall.com/game/guaguale/index.html", 1, 2, "{name}: {url}不响应"), | |||
| (112, "test-callback","https://callbacktest.malls.iformall.com/api/version", 1, 2, "{name}: {url}不响应"), | |||
| (201, "生产环境-管理端","https://admin.malls.iformall.com/api/version", 1, 3, "{name}: {url}不响应"), | |||
| (202, "生产环境-C端","https://c.malls.iformall.com/C/api/mall/version", 1, 3, "{name}: {url} 不响应"), | |||
| (203, "生产环境-B端","https://b.malls.iformall.com/B/api/mall/version", 1, 3, "{name}: {url}不响应"), | |||
| (204, "生产环境-Schedule","https://s.malls.iformall.com/S/version", 1, 3, "{name}: {url}不响应"), | |||
| (205, "生产环境-消息服务器","https://s.malls.iformall.com/mq/version", 1, 3, "{name}: {url}不响应"), | |||
| (206, "生产环境-websocket服务器","https://s.malls.iformall.com/W/version", 1, 3, "{name}: {url}不响应"), | |||
| (207, "生产环境-微信第三方开放平台","https://open.malls.iformall.com/O/version", 1, 3, "{name}: {url}不响应"), | |||
| (208, "生产环境-移动端数据塔台","https://mobile.malls.iformall.com/#/", 1, 3, "{name}: {url}不响应"), | |||
| (209, "生产环境-幸运卡牌","https://game.malls.iformall.com/game/luckCard/index.html", 1, 3, "{name}: {url}不响应"), | |||
| (210, "生产环境-幸运砸金蛋","https://game.malls.iformall.com/game/goldEgg/index.html", 1, 3, "{name}: {url}不响应"), | |||
| (211, "生产环境-幸运刮刮乐","https://game.malls.iformall.com/game/guaguale/index.html", 1, 3, "{name}: {url}不响应"), | |||
| (212, "生产环境-callback","https://callback.malls.iformall.com/api/version", 1, 3, "{name}: {url}不响应") | |||
| ; | |||
| @@ -32,6 +32,12 @@ public class ScheduleApplication { | |||
| @Value("${fm.upload_dir}") | |||
| private String uploadDir; | |||
| @Value("${fm.monitor_emails}") | |||
| private String fmMonitorEmails; | |||
| @Value("${fm.monitor_enable}") | |||
| private boolean fmMonitor; | |||
| @Bean | |||
| public boolean isFmException() { | |||
| return fmException; | |||
| @@ -52,6 +58,17 @@ public class ScheduleApplication { | |||
| return uploadDir; | |||
| } | |||
| @Bean | |||
| public String fmMonitorEmails() { | |||
| return fmMonitorEmails; | |||
| } | |||
| @Bean | |||
| public boolean isFmMonitor() { | |||
| return fmMonitor; | |||
| } | |||
| public static void main(String[] args) { | |||
| SpringApplication.run(ScheduleApplication.class, args); | |||
| @@ -0,0 +1,72 @@ | |||
| package com.iformall.schedule; | |||
| import com.iformall.domain.po.SysMonitor; | |||
| import com.iformall.mapper.*; | |||
| import com.iformall.service.MailService; | |||
| import com.iformall.utils.HttpUtil; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.scheduling.annotation.Scheduled; | |||
| import org.springframework.stereotype.Component; | |||
| import java.util.List; | |||
| @Component | |||
| public class SysMonitorSchedule { | |||
| private final Logger logger = LoggerFactory.getLogger(this.getClass()); | |||
| @Autowired | |||
| private String fmMonitorEmails; | |||
| @Autowired | |||
| private boolean isFmMonitor; | |||
| @Autowired | |||
| private MailService mailService; | |||
| @Autowired | |||
| private SysMonitorMapper sysMonitorMapper; | |||
| @Scheduled(cron = "0 */5 * * * *?") // 每隔5分钟检查一下各个网址 | |||
| public void checkUrls() { | |||
| if(isFmMonitor) { | |||
| SysMonitor q = new SysMonitor(); | |||
| List<SysMonitor> sysMonitors = sysMonitorMapper.findList(q); | |||
| for (SysMonitor sysMonitor : sysMonitors) { | |||
| checkSysMonitor(sysMonitor); | |||
| } | |||
| } | |||
| } | |||
| private void checkSysMonitor(SysMonitor sysMonitor) { | |||
| boolean isNormal = true; | |||
| try { | |||
| String result = HttpUtil.doGet(sysMonitor.getUrl()); | |||
| if(StringUtils.isBlank(result)) { | |||
| isNormal = false; | |||
| } else { | |||
| logger.info(result); | |||
| } | |||
| } catch (RuntimeException e) { | |||
| logger.error(e.getMessage()); | |||
| isNormal = false; | |||
| } | |||
| if(!isNormal) { | |||
| String[] receivers = fmMonitorEmails.split(","); | |||
| String content = sysMonitor.getErrMsg(); | |||
| content = content.replace("{name}", sysMonitor.getName()); | |||
| content = content.replace("{url}", sysMonitor.getUrl()); | |||
| //发送邮件 | |||
| mailService.sendSimpleMail(receivers, sysMonitor.getName() + "访问异常", content); | |||
| } | |||
| } | |||
| } | |||
| @@ -108,6 +108,8 @@ fm: | |||
| deploy: 1 | |||
| open: true | |||
| upload_dir: /home/test/server/uploads/ | |||
| monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com | |||
| monitor_enable: true | |||
| logging: | |||
| level: | |||
| @@ -93,6 +93,8 @@ fm: | |||
| deploy: 3 | |||
| open: true | |||
| upload_dir: /home/ec2-user/server/uploads/ | |||
| monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com | |||
| monitor_enable: false | |||
| logging: | |||
| level: | |||
| @@ -93,6 +93,8 @@ fm: | |||
| deploy: 2 | |||
| open: true | |||
| upload_dir: /home/ec2-user/server/uploads/ | |||
| monitor_emails: hupeng@iformall.com,wuguoqiang@iformall.com,gongbiao@iformall.com,luozukai@iformall.com,sunmingming@iformall.com,huanghui@iformall.com,wangmei@iformall.com | |||
| monitor_enable: false | |||
| logging: | |||
| level: | |||
| @@ -0,0 +1,95 @@ | |||
| package com.iformall.domain.po; | |||
| import lombok.Data; | |||
| import javax.persistence.*; | |||
| import javax.persistence.Transient; | |||
| import java.util.List; | |||
| import javax.persistence.Id; | |||
| import java.io.Serializable; | |||
| @Table(name = "sys_monitor") | |||
| @Data | |||
| public class SysMonitor implements Serializable { | |||
| private static final long serialVersionUID = 1L; | |||
| @Id | |||
| protected Long id; | |||
| @Transient | |||
| protected List<Long> ids; | |||
| @Transient | |||
| protected String sortColumns; | |||
| @io.swagger.annotations.ApiModelProperty(value="网址url",name="name") | |||
| private String name; | |||
| @io.swagger.annotations.ApiModelProperty(value="网址url",name="url") | |||
| private String url; | |||
| @io.swagger.annotations.ApiModelProperty(value="1=网址监控",name="type") | |||
| private Integer type; | |||
| @io.swagger.annotations.ApiModelProperty(value="1=dev 2=test 3=release",name="deploy") | |||
| private Integer deploy; | |||
| @io.swagger.annotations.ApiModelProperty(value="",name="errMsg") | |||
| private String errMsg; | |||
| public static enum Field | |||
| { | |||
| Id_ASC("`id` ASC"),Id_DESC("`id` DESC") | |||
| ,Name_ASC("`name` ASC"),Name_DESC("`name` DESC") | |||
| ,Url_ASC("`url` ASC"),Url_DESC("`url` DESC") | |||
| ,Type_ASC("`type` ASC"),Type_DESC("`type` DESC") | |||
| ,Deploy_ASC("`deploy` ASC"),Deploy_DESC("`deploy` DESC") | |||
| ,ErrMsg_ASC("`err_msg` ASC"),ErrMsg_DESC("`err_msg` DESC") | |||
| ; | |||
| private String value; | |||
| Field(String value){ | |||
| this.value = value; | |||
| } | |||
| public String getValue() { | |||
| return value; | |||
| } | |||
| public void setCol(String value) { | |||
| this.value = value; | |||
| } | |||
| @Override | |||
| public String toString() { | |||
| return this.getValue(); | |||
| } | |||
| } | |||
| public void setSortColumns(SysMonitor.Field... fields) | |||
| { | |||
| if (fields == null || fields.length == 0) { | |||
| return; | |||
| } | |||
| for (int k = 0; k < fields.length; k++) { | |||
| if (fields[k] == null) { | |||
| return; | |||
| } | |||
| } | |||
| StringBuilder sb = new StringBuilder(fields[0].toString()); | |||
| for (int k = 1; k < fields.length; k++) { | |||
| sb.append(","); | |||
| sb.append(fields[k].toString()); | |||
| } | |||
| this.sortColumns = sb.toString(); | |||
| } | |||
| public void setSortColumns(String sortColumns) | |||
| { | |||
| if (sortColumns == null || "".equals(sortColumns.trim())) { | |||
| return; | |||
| } | |||
| if (sortColumns.contains(",")) { | |||
| String[] cols = sortColumns.split(","); | |||
| java.util.List<Field> fList = new java.util.ArrayList(); | |||
| for (int k = 0; k < cols.length; k++) { | |||
| fList.add(Field.valueOf(cols[k])); | |||
| } | |||
| this.setSortColumns(fList.toArray(new Field[fList.size()])); | |||
| } else { | |||
| this.setSortColumns(Field.valueOf(sortColumns)); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,16 @@ | |||
| package com.iformall.mapper; | |||
| import java.util.*; | |||
| import com.iformall.common.CommonMapper; | |||
| import com.iformall.domain.po.SysMonitor; | |||
| public interface SysMonitorMapper extends CommonMapper<SysMonitor, Long> { | |||
| List<SysMonitor> findList(SysMonitor sysMonitor); | |||
| } | |||
| @@ -0,0 +1,57 @@ | |||
| package com.iformall.service; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.domain.po.SysMonitor; | |||
| import java.util.List; | |||
| public interface SysMonitorService { | |||
| /** | |||
| * 根据实体查询分页列表 | |||
| * | |||
| * @param record | |||
| * @param pageIndex | |||
| * @param pageSize | |||
| * @return | |||
| */ | |||
| PageInfo<SysMonitor> listAsPage(SysMonitor record, Integer pageIndex, Integer pageSize); | |||
| /** | |||
| * 根据实体查询列表 | |||
| * | |||
| * @param record | |||
| * @return | |||
| */ | |||
| List<SysMonitor> getList(SysMonitor record); | |||
| /** | |||
| * 根据Id获得实体 | |||
| * | |||
| * @param id | |||
| * @return | |||
| */ | |||
| SysMonitor getById(Long id); | |||
| /** | |||
| * 保存或更新实体 | |||
| * | |||
| * @param record | |||
| */ | |||
| void saveOrUpdate(SysMonitor record); | |||
| /** | |||
| * 根据Id删除实体 | |||
| * | |||
| * @param id | |||
| */ | |||
| void deleteById(Long id); | |||
| } | |||
| @@ -0,0 +1,59 @@ | |||
| package com.iformall.service.impl; | |||
| import java.util.*; | |||
| import com.github.pagehelper.PageHelper; | |||
| import com.github.pagehelper.PageInfo; | |||
| import com.iformall.domain.po.SysMonitor; | |||
| import com.iformall.mapper.SysMonitorMapper; | |||
| import com.iformall.service.SysMonitorService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Service; | |||
| import com.iformall.common.IdWorker; | |||
| @Service | |||
| public class SysMonitorServiceImpl implements SysMonitorService { | |||
| @Autowired | |||
| SysMonitorMapper sysMonitorMapper; | |||
| @Override | |||
| public PageInfo<SysMonitor> listAsPage(SysMonitor record, Integer pageIndex, Integer pageSize) { | |||
| return PageHelper.startPage(pageIndex, pageSize).doSelectPageInfo(() -> sysMonitorMapper.findList(record)); | |||
| } | |||
| @Override | |||
| public List<SysMonitor> getList(SysMonitor record) { | |||
| return sysMonitorMapper.findList(record); | |||
| } | |||
| @Override | |||
| public SysMonitor getById(Long id) { | |||
| return sysMonitorMapper.selectByPrimaryKey(id); | |||
| } | |||
| @Override | |||
| public void saveOrUpdate(SysMonitor record) { | |||
| if (record.getId() == null) { | |||
| //record.setId(UUID.randomUUID().toString().replaceAll("-", "")); | |||
| final IdWorker idWorker = IdWorker.get(); | |||
| record.setId(idWorker.nextId()); | |||
| sysMonitorMapper.insertSelective(record); | |||
| } else { | |||
| sysMonitorMapper.updateByPrimaryKeySelective(record); | |||
| } | |||
| } | |||
| @Override | |||
| public void deleteById(Long id) { | |||
| sysMonitorMapper.deleteByPrimaryKey(id); | |||
| } | |||
| } | |||
| @@ -0,0 +1,56 @@ | |||
| <?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.iformall.mapper.SysMonitorMapper"> | |||
| <resultMap id="BaseResultMap" type="com.iformall.domain.po.SysMonitor"> | |||
| <id column="id" jdbcType="BIGINT" property="id" /> | |||
| <result column="name" jdbcType="VARCHAR" property="name" /> | |||
| <result column="url" jdbcType="VARCHAR" property="url" /> | |||
| <result column="type" jdbcType="INTEGER" property="type" /> | |||
| <result column="deploy" jdbcType="INTEGER" property="deploy" /> | |||
| <result column="err_msg" jdbcType="VARCHAR" property="errMsg" /> | |||
| </resultMap> | |||
| <sql id="allColumns"> | |||
| `id`,`name`,`url`,`type`,`deploy`,`err_msg` | |||
| </sql> | |||
| <sql id="dynamicWhereConditions"> | |||
| where 1 = 1 | |||
| <if test=" null != id "> | |||
| and `id` = #{id} | |||
| </if> | |||
| <if test=" null != name "> | |||
| and `name` = #{name} | |||
| </if> | |||
| <if test=" null != url "> | |||
| and `url` = #{url} | |||
| </if> | |||
| <if test=" null != type "> | |||
| and `type` = #{type} | |||
| </if> | |||
| <if test=" null != deploy "> | |||
| and `deploy` = #{deploy} | |||
| </if> | |||
| <if test=" null != errMsg "> | |||
| and `err_msg` like concat('%', #{errMsg},'%') | |||
| </if> | |||
| <if test=" null != ids "> | |||
| and id in | |||
| <foreach collection="ids" index="index" item="idItem" open="(" separator="," close=")"> | |||
| #{idItem} | |||
| </foreach> | |||
| </if> | |||
| <if test=" null != sortColumns"> order by ${sortColumns} </if> | |||
| </sql> | |||
| <select id="findList" parameterType="com.iformall.domain.po.SysMonitor" resultMap="BaseResultMap"> | |||
| select <include refid="allColumns" /> from sys_monitor | |||
| <include refid="dynamicWhereConditions" /> | |||
| </select> | |||
| </mapper> | |||