初次提交

This commit is contained in:
2025-06-30 10:11:32 +08:00
commit f059c64d0e
1785 changed files with 258159 additions and 0 deletions

3
xxl-job/danji.Dockerfile Normal file
View File

@ -0,0 +1,3 @@
FROM jenkins/jenkins
ADD target/xxl-job.jar /xxl-job.jar
ENTRYPOINT ["java","-jar","/xxl-job.jar","--spring.profiles.active=danji","-c"]

3
xxl-job/open.Dockerfile Normal file
View File

@ -0,0 +1,3 @@
FROM jenkins/jenkins
ADD target/xxl-job.jar /xxl-job.jar
ENTRYPOINT ["java","-jar","/xxl-job.jar","--spring.profiles.active=open","-c"]

76
xxl-job/pom.xml Normal file
View File

@ -0,0 +1,76 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>ho-cloud</artifactId>
<groupId>com.hoenergy</groupId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>xxl-job</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<common-tools.version>1.0</common-tools.version>
<business-service-api.version>1.0</business-service-api.version>
</properties>
<dependencies>
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</dependency>
<!--工具类-->
<dependency>
<groupId>com.hoenergy</groupId>
<artifactId>common-tools</artifactId>
<version>${common-tools.version}</version>
</dependency>
<!--business-service-api-->
<dependency>
<groupId>com.hoenergy</groupId>
<artifactId>business-service-api</artifactId>
<version>${business-service-api.version}</version>
</dependency>
<!--OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- starter-webspring-webmvc + autoconfigure + logback + yaml + tomcat -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<defaultGoal>compile</defaultGoal>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.2.12.RELEASE</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>true</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,234 @@
package com.ho.xxljob;
import com.alibaba.fastjson.JSONObject;
import com.ho.business.vo.req.MonitorQuery;
import com.ho.common.tools.service.RedisService;
import com.ho.common.tools.util.RedisCommon;
import com.ho.xxljob.feignclient.BusinessFeignClient;
import com.ho.xxljob.feignclient.FileFeignClient;
import com.ho.xxljob.feignclient.FlowFeignClient;
import com.ho.xxljob.handlers.TimeGenerateService;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import com.xxl.job.core.util.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Date;
/**
* @author fancl
* @desc: 执行器:所有执行任务都是以Bean的方式定义
* @date 2022/10/19
*/
@Component
@Slf4j
public class JobHandler {
@Autowired
RedisCommon redisUtil;
@Autowired
TimeGenerateService timeGenerateService;
@Autowired
BusinessFeignClient businessFeignClient;
@Autowired
FlowFeignClient flowFeignClient;
@Autowired
FileFeignClient fileFeignClient;
@Autowired
RedisService redisService;
/**
* 生成监控页面需要的时间缓存数据Redis
*/
@XxlJob("generateMonitorRedisTimeHandler")
public ReturnT<String> generateMonitorRedisTimeHandler(String param) throws Exception {
XxlJobLogger.log("generateMonitorRedisTimeHandler ");
log.info("generateMonitorRedisTimeHandler start !");
timeGenerateService.buildTimeMinutes();
timeGenerateService.buildTimeDays();
//每年的各个月
timeGenerateService.buildYearMonth();
log.info("generateMonitorRedisTimeHandler end !");
return ReturnT.SUCCESS;
}
//光伏逆变器每15分钟根据发电量 和 电价表 产生的收益,入库到income_total表
@XxlJob("jobIntervalGene4RealTimeDataBySrc")
public ReturnT<String> jobIntervalGene4RealTimeDataBySrc(String param) throws Exception {
XxlJobLogger.log("jobIntervalGene4RealTimeDataBySrc ");
log.info("jobIntervalGeneAndProfitByDay start !");
businessFeignClient.intervalGene4RealTimeDataBySrc();
log.info("jobIntervalGeneAndProfitByDay end !");
return ReturnT.SUCCESS;
}
/**
* 定时检测电站的接入点是否在线或离线()
*/
@XxlJob("accessPointEvent")
public ReturnT<String> accessPointEvent(String param) throws Exception {
XxlJobLogger.log("accessPointEvent ");
log.info("accessPointEvent start !");
flowFeignClient.accessPointEvent();
log.info("accessPointEvent end !");
return ReturnT.SUCCESS;
}
/**
* 定时删除多余的图片及文件数据
*/
@XxlJob("deletedPicture")
public ReturnT<String> deletedPicture(String param) throws Exception {
XxlJobLogger.log("deletedPicture ");
log.info("deletedPicture start !");
flowFeignClient.deletedPicture();
businessFeignClient.deletedPicture();
log.info("deletedPicture end !");
return ReturnT.SUCCESS;
}
/**
* 加工一体柜 充电量,放电量,当月充电量,当月放电量
* 暂时用不到
*/
@XxlJob("jobIntegratedCabinet")
public ReturnT<String> jobIntegratedCabinet(String param) throws Exception {
XxlJobLogger.log("jobIntegratedCabinet,param: {} ", param);
//参数转换为MonitorQuery对象
MonitorQuery monitorQuery = new MonitorQuery();
if (!StringUtils.isEmpty(param)) {
monitorQuery = JSONObject.parseObject(param, MonitorQuery.class);
}
log.info("jobIntegratedCabinet start !");
//建议改成异步调用,这个方法会比较耗时
businessFeignClient.jobIntegratedCabinet(monitorQuery);
log.info("jobIntegratedCabinet end !");
return ReturnT.SUCCESS;
}
/**
* 加工一体柜 充电量,放电量,当月充电量,当月放电量(小时)
* 暂时用不到
*/
@XxlJob("jobIntegratedCabinetHour")
public ReturnT<String> jobIntegratedCabinetHour(String param) throws Exception {
XxlJobLogger.log("jobIntegratedCabinetHour,param: {} ", param);
//参数转换为MonitorQuery对象
MonitorQuery monitorQuery = new MonitorQuery();
if (!StringUtils.isEmpty(param)) {
monitorQuery = JSONObject.parseObject(param, MonitorQuery.class);
}
log.info("jobIntegratedCabinetHour start !");
//建议改成异步调用,这个方法会比较耗时
businessFeignClient.jobIntegratedCabinetHour(monitorQuery);
log.info("jobIntegratedCabinetHour end !");
return ReturnT.SUCCESS;
}
/**
* 每天加工天气数据
* 暂时用不到
*/
@XxlJob("jobStationWeathers")
public ReturnT<String> jobStationWeathers(String param) throws Exception {
XxlJobLogger.log("jobStationWeathers,param: {} ", param);
log.info("jobStationWeathers start !");
//建议改成异步调用,这个方法会比较耗时
fileFeignClient.jobStationWeathers();
log.info("jobStationWeathers end !");
return ReturnT.SUCCESS;
}
/**
* 收益统计定时任务
*/
@XxlJob("jobIncomeDataManage")
public ReturnT<String> jobIncomeDataManage(String param) throws Exception {
XxlJobLogger.log("jobIncomeDataManage ");
log.info("jobIncomeDataManage start !");
businessFeignClient.jobIncomeDataManage();
log.info("jobIncomeDataManage end !");
return ReturnT.SUCCESS;
}
@XxlJob("jobEarningsCalculate")
public ReturnT<String> jobEarningsCalculate(String param) {
XxlJobLogger.log("jobEarningsCalculate");
log.info("jobMaintenanceInsert start !");
Date date = DateUtil.addDays(new Date(), -1);
businessFeignClient.jobEarningsCalculate(DateUtil.formatDate(date));
log.info("jobMaintenanceInsert end !");
return ReturnT.SUCCESS;
}
/**
* 计算收益(当日)
*
* @param param
* @return
*/
@XxlJob("jobEarningsCalculateHour")
public ReturnT<String> jobEarningsCalculateHour(String param) {
XxlJobLogger.log("jobEarningsCalculateHour");
log.info("jobEarningsCalculateHour start !");
businessFeignClient.jobEarningsCalculate(DateUtil.formatDate(new Date()));
log.info("jobEarningsCalculateHour end !");
return ReturnT.SUCCESS;
}
@XxlJob("regularlySendNotifications")
public ReturnT<String> regularlySendNotifications(String param) {
XxlJobLogger.log("regularlySendNotifications,param: {} ", param);
//参数转换为MonitorQuery对象
MonitorQuery monitorQuery = new MonitorQuery();
if (!StringUtils.isEmpty(param)) {
monitorQuery = JSONObject.parseObject(param, MonitorQuery.class);
}
log.info("regularlySendNotifications start !");
flowFeignClient.regularlySendNotifications(monitorQuery);
log.info("regularlySendNotifications end !");
return ReturnT.SUCCESS;
}
@XxlJob("jobFreezeMonthTotalEle")
public ReturnT<String> jobFreezeMonthTotalEle(String param) {
XxlJobLogger.log("jobEarningsCalculate");
log.info("jobMaintenanceInsert start !");
businessFeignClient.jobFreezeMonthTotalEle();
log.info("jobMaintenanceInsert end !");
return ReturnT.SUCCESS;
}
//定时获取每个电站的日充日放
@XxlJob("jobGetDayDate")
public ReturnT<String> jobGetDayDate(String param) {
XxlJobLogger.log("jobGetDayDate");
log.info("jobGetDayDate start !");
businessFeignClient.jobGetDayDate();
log.info("jobGetDayDate end !");
return ReturnT.SUCCESS;
}
/**
* 定时任务,根据时间刷新消息广播发送状态及阅读状态
* @return
*/
@XxlJob("jobUpdateMessageInfo")
public ReturnT<String> jobUpdateMessageInfo(String param){
log.info("jobUpdateMessageInfo start !");
businessFeignClient.jobUpdateMessageInfo();
log.info("jobUpdateMessageInfo end !");
return ReturnT.SUCCESS;
}
}

View File

@ -0,0 +1,20 @@
package com.ho.xxljob;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* 业务中心启动类
*/
@SpringBootApplication(scanBasePackages = {"com.ho.common", "com.ho.xxljob"},
exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.ho.xxljob.feignclient"})
public class XxlJobApplication {
public static void main(String[] args) {
SpringApplication.run(XxlJobApplication.class, args);
}
}

View File

@ -0,0 +1,63 @@
package com.ho.xxljob.config;
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author fancl
* @desc: Job配置
* @date 2022/10/19
*/
@Configuration
@Slf4j
@Getter
@Setter
public class XxlJobConfig {
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@Value("${xxl.job.executor.appname}")
private String appname;
@Value("${xxl.job.executor.address}")
private String address;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.executor.logpath}")
private String logPath;
@Value("${xxl.job.executor.logretentiondays}")
private int logRetentionDays;
@Bean
public XxlJobSpringExecutor xxlJobExecutor() {
log.info(">>>>>>>>>>> xxl-job config init.");
XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
xxlJobSpringExecutor.setAppname(appname);
xxlJobSpringExecutor.setAddress(address);
xxlJobSpringExecutor.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}

View File

@ -0,0 +1,70 @@
package com.ho.xxljob.feignclient;
import com.ho.business.vo.req.MonitorQuery;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.DataResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(value = ContextConstant.BUSINESS_SERVICE, fallback = BusinessFeignClientFallback.class)
public interface BusinessFeignClient {
// 加工一体柜充电量,放电量(小时)
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/jobIntegratedCabinetHour")
DataResult jobIntegratedCabinetHour(@RequestBody MonitorQuery monitorQuery);
// 加工一体柜充电量,放电量
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/jobIntegratedCabinet")
DataResult jobIntegratedCabinet(@RequestBody MonitorQuery monitorQuery);
//每天站级天气定时任务
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.MEDIA_CONTEXT + "weather/jobStationWeathers")
DataResult jobStationWeathers();
/* 15分钟收益数据 */
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "income/jobDataManage")
DataResult intervalGene4RealTimeDataBySrc();
//删除图片及文件数据
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/deletedPicture")
void deletedPicture();
//删除图片及文件数据
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "cockpit/revenueStatisticsJob")
void revenueStatisticsJob();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "openStation/jobDataManage")
void jobIncomeDataManage();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/jobStationState")
void jobStationState();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "stationMaintenance/maintenanceInsert")
void jobMaintenanceInsert();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "earningsCalculate/all")
void jobEarningsCalculate(@RequestBody String dateTime);
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "earningsCalculate/freezeMonthTotalEle")
void jobFreezeMonthTotalEle();
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/jobGetDayDate")
void jobGetDayDate();
/**
* 定时计算效率
*/
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "outerApi/jobGetSystemEfficiency")
void jobGetSystemEfficiency();
/**
* 定时刷新消息广播
*/
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.BUSINESS + "messageInfo/jobUpdateMessageInfo")
void jobUpdateMessageInfo();
}

View File

@ -0,0 +1,102 @@
package com.ho.xxljob.feignclient;
import com.ho.business.vo.req.MonitorQuery;
import com.ho.common.tools.exception.BaseResponseCode;
import com.ho.common.tools.exception.BusinessException;
import com.ho.common.tools.exception.DataResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class BusinessFeignClientFallback implements BusinessFeignClient {
Logger log = LoggerFactory.getLogger(getClass());
@Override
public DataResult jobIntegratedCabinetHour(MonitorQuery monitorQuery) {
log.error("BusinessFeignClient.jobIntegratedCabinetHour error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public DataResult jobIntegratedCabinet(MonitorQuery monitorQuery) {
log.error("BusinessFeignClient.jobIntegratedCabinet error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public DataResult jobStationWeathers() {
log.error("BusinessFeignClient.jobStationWeathers error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public DataResult intervalGene4RealTimeDataBySrc() {
log.error("BusinessFeignClient.intervalGene4RealTimeDataBySrc error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void deletedPicture() {
log.error("BusinessFeignClient.deletedPicture error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void revenueStatisticsJob() {
log.error("BusinessFeignClient.revenueStatisticsJob error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobIncomeDataManage() {
log.error("BusinessFeignClient.jobIncomeDataManage error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobStationState() {
log.error("BusinessFeignClient.jobStationState error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobMaintenanceInsert() {
log.error("BusinessFeignClient.jobMaintenanceInsert error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobEarningsCalculate(String dateTime) {
log.error("BusinessFeignClient.jobEarningsCalculate error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobFreezeMonthTotalEle() {
log.error("BusinessFeignClient.jobFreezeMonthTotalEle error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobGetDayDate() {
log.error("BusinessFeignClient.jobGetDayDate error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobGetSystemEfficiency() {
log.error("BusinessFeignClient.jobGetSystemEfficiency error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void jobUpdateMessageInfo() {
log.error("BusinessFeignClient.jobUpdateMessageInfo error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
}

View File

@ -0,0 +1,18 @@
package com.ho.xxljob.feignclient;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.DataResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @Description flow模块的远程调用
* Author yule
* Date 2023/3/17 10:20
*/
@FeignClient(value = ContextConstant.FILE_CENTER, fallback = FileFeignClientFallback.class)
public interface FileFeignClient {
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.MEDIA_CONTEXT + "weather/jobStationWeathers")
DataResult jobStationWeathers();
}

View File

@ -0,0 +1,23 @@
package com.ho.xxljob.feignclient;
import com.ho.common.tools.exception.BaseResponseCode;
import com.ho.common.tools.exception.BusinessException;
import com.ho.common.tools.exception.DataResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author fancl
* @desc:
* @date 2023/5/16
*/
@Component
@Slf4j
public class FileFeignClientFallback implements FileFeignClient{
@Override
public DataResult jobStationWeathers() {
log.error("FileFeignClientFallback.jobStationWeathers error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
}

View File

@ -0,0 +1,29 @@
package com.ho.xxljob.feignclient;
import com.ho.business.vo.req.MonitorQuery;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.DataResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* @Description flow模块的远程调用
* Author yule
* Date 2023/3/17 10:20
*/
@FeignClient(value = ContextConstant.FLOW_CENTER, fallback = FlowFeignClientFallback.class)
public interface FlowFeignClient {
//判断电站接入点状态
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.FLOW_CONTEXT + "outerApi/accessPointEvent")
void accessPointEvent();
//删除图片及文件数据
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.FLOW_CONTEXT + "outerApi/deletedPicture")
void deletedPicture();
//判断告警类型为告警等级(等级为3)定时发生短信任务
@PostMapping(value = ContextConstant.ROOT_CONTEXT + ContextConstant.FLOW_CONTEXT + "outerApi/regularlySendNotifications")
void regularlySendNotifications(@RequestBody MonitorQuery monitorQuery);
}

View File

@ -0,0 +1,41 @@
package com.ho.xxljob.feignclient;
import com.ho.business.vo.req.MonitorQuery;
import com.ho.common.tools.constant.ContextConstant;
import com.ho.common.tools.exception.BaseResponseCode;
import com.ho.common.tools.exception.BusinessException;
import com.ho.common.tools.exception.DataResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @Description flow模块远程调用失败策略
* Author yule
* Date 2023/3/17 10:22
*/
@Component
public class FlowFeignClientFallback implements FlowFeignClient{
Logger log = LoggerFactory.getLogger(getClass());
@Override
public void accessPointEvent() {
log.error(" FlowFeignClient.accessPointEvent error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void deletedPicture() {
log.error(" FlowFeignClient.deletedPicture error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
@Override
public void regularlySendNotifications(MonitorQuery monitorQuery) {
log.error(" FlowFeignClient.deletedPicture error!");
throw new BusinessException(BaseResponseCode.FEIGN_CALL_FAIL);
}
}

View File

@ -0,0 +1,60 @@
package com.ho.xxljob.handlers;
import com.ho.common.tools.constant.RedisKeyConstant;
import com.ho.common.tools.util.RedisCommon;
import com.ho.xxljob.util.TimeConvertUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author fancl
* @desc: 时间生成处理器
* @date 2022/10/19
*/
@Service
@Slf4j
public class TimeGenerateService {
@Autowired
RedisCommon redisUtil;
//按分钟的时间间隔
public void buildTimeMinutes() {
Date date = new Date();
//建立5分钟间隔数据
List<String> fiveMinutesList = new ArrayList<>(300);
List<String> OneMinutesList = new ArrayList<>(1440);
List<String> sixtyMinutesList = new ArrayList<>(24);
List<String> thirtyMinutesList = new ArrayList<>(48);
fiveMinutesList = TimeConvertUtil.minute(date, 5);
OneMinutesList = TimeConvertUtil.minute(date, 1);
thirtyMinutesList = TimeConvertUtil.minute(date,30);
sixtyMinutesList = TimeConvertUtil.minute2(date, 60);
redisUtil.set(RedisKeyConstant.FIVE_MINUTE_INTERVAL, fiveMinutesList);
redisUtil.set(RedisKeyConstant.ONE_MINUTE_INTERVAL, OneMinutesList);
redisUtil.set(RedisKeyConstant.SIXTY_MINUTE_INTERVAL,sixtyMinutesList);
redisUtil.set(RedisKeyConstant.THIRTY_MINUTE_INTERVAL,thirtyMinutesList);
}
//每月每天的数据 yyyy-MM-dd
public void buildTimeDays() {
Date date = new Date();
List<String> currentMonthList = new ArrayList<>(TimeConvertUtil.getCurrentMonthLastDay());
currentMonthList = TimeConvertUtil.day(date, 1);
redisUtil.set(RedisKeyConstant.ONE_DAY_INTERVAL,currentMonthList);
}
//每年每月数据 yyyy-MM
public void buildYearMonth(){
//每年每月
Date dateMonth = new Date();
List<String> currentYearMonthList = new ArrayList<>(20);
currentYearMonthList = TimeConvertUtil.month(dateMonth, 1);
redisUtil.set(RedisKeyConstant.MONTH_INTERVAL,currentYearMonthList);
}
}

View File

@ -0,0 +1,122 @@
package com.ho.xxljob.util;
import cn.hutool.core.date.DateUtil;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
/**
* @author fancl
* @desc: 时间转换
* @date 2022/10/19
*/
public class TimeConvertUtil {
//时间字符串格式(以分钟为单位)
public static List<String> minute(Date date, int offset) {
Date start = dayStartDate(date);//转换为天的起始date
Date nextDayDate = nextDay(start);//下一天的date
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
List<String> result = new ArrayList<>(720);
while (start.compareTo(nextDayDate) < 0) {
result.add(sdf.format(start));
//日期加5分钟
start = addMinutes(start, offset);
}
return result;
}
public static List<String> minute2(Date date, int offset) {
Date start = dayStartDate(date);//转换为天的起始date
Date nextDayDate = nextDay(start);//下一天的date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<String> result = new ArrayList<>(20);
while (start.compareTo(nextDayDate) < 0) {
result.add(sdf.format(start));
//日期加5分钟
start = addMinutes(start, offset);
}
return result;
}
//以天为单位
public static List<String> day(Date date, int offset) {
Date start = DateUtil.beginOfMonth(date);//转换为天的起始date
Date nextDayDate = DateUtil.endOfMonth(date);//下一天的date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> result = new ArrayList<>(getCurrentMonthLastDay());
while (start.compareTo(nextDayDate) < 0) {
result.add(sdf.format(start));
//日期加一天
start = addDays(start, offset);
}
return result;
}
//以月为单位
public static List<String> month(Date date, int offset) {
Date start = DateUtil.beginOfYear(date);//转换为天的起始date
Date nextDayDate = DateUtil.endOfYear(date);//下一天的date
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
List<String> result = new ArrayList<>(20);
while (start.compareTo(nextDayDate) < 0) {
result.add(sdf.format(start));
//加一个月
start = addMonth(start, offset);
}
return result;
}
//增加时间间隔
public static Date addMinutes(Date start, int offset) {
Calendar c = Calendar.getInstance();
c.setTime(start);
c.add(Calendar.MINUTE, offset);
return c.getTime();
}
public static Date addDays(Date start, int offset) {
Calendar c = Calendar.getInstance();
c.setTime(start);
c.add(Calendar.DAY_OF_MONTH, offset);
return c.getTime();
}
private static Date addMonth(Date start, int offset) {
Calendar c = Calendar.getInstance();
c.setTime(start);
c.add(Calendar.MONTH, offset);
return c.getTime();
}
public static Date nextDay(Date start) {
Calendar c = Calendar.getInstance();
c.setTime(start);
c.add(Calendar.DATE, 1);
return c.getTime();
}
public static Date dayStartDate(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
return c.getTime();
}
public static int getCurrentMonthLastDay()
{
Calendar a = Calendar.getInstance();
a.set(Calendar.DATE, 1);//把日期设置为当月第一天
a.roll(Calendar.DATE, -1);//日期回滚一天,也就是最后一天
int maxDate = a.get(Calendar.DATE);
return maxDate;
}
}

View File

@ -0,0 +1,50 @@
server:
port: 8016
spring:
jackson:
time-zone: GMT+8
application:
name: xxl-job
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
#Redis
redis:
port: 6379 #端口
timeout: 3000ms #连接超时
host: 1.95.153.121 #单机
password: zzkj@688737
database: 0
#port: 6379 #端口
#timeout: 5000ms #连接超时
#host: 127.0.0.1 #单机
#password:
#database: 0
#集群 真实环境开启
# record:
# nodes:
# - 127.0.0.1:6379
# - 127.0.0.1:6380
# - 127.0.0.1:6381
lettuce:
pool:
max-active: 8 #连接池最大连接 默认8
max-idle: 8 #连接池中最大空闲连接 默认8
min-idle: 1 #连接池中最小空闲连接 默认0
max-wait: 2000ms #连接池最大阻塞等待时间 使用负值表示没有限制
xxl:
job:
admin:
addresses: http://127.0.0.1:8015/job-admin
accessToken:
executor:
appname: job-executor-sample
address:
ip: 127.0.0.1
port: 9999
logpath: /home/hocloud/logs/xxl-job/
logretentiondays: 30

View File

@ -0,0 +1,11 @@
spring:
profiles:
active: dev
messages:
basename: i18n/messages
encoding: utf-8
#ribbon的超时时间
ribbon:
ReadTimeout: 20000
ConnectTimeout: 20000

View File

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS,CTT} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/hocloud/logs/xxl-job/xxl-job.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/hocloud/logs/xxl-job/xxl-job.%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<!--180天-->
<maxHistory>10</maxHistory>
<!-- 除按日志记录之外还配置了日志文件不能超过2M若超过2M日志文件会以索引0开始
命名日志文件例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>256MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS,CTT} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<!--Error级别-->
<appender name="errorFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>/home/hocloud/logs/xxl-job/xxl-job-error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>/home/hocloud/logs/xxl-job/xxl-job-error.%d{yyyy-MM-dd}-%i.log
</fileNamePattern>
<!--180天-->
<maxHistory>10</maxHistory>
<!-- 除按日志记录之外还配置了日志文件不能超过2M若超过2M日志文件会以索引0开始
命名日志文件例如log-error-2013-12-21.0.log -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>256MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
<!-- 此filter过滤debug级别以下的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- 级别过滤器,根据日志级别进行过滤。-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- project default level -->
<logger name="com.ho.business" level="DEBUG"/>
<!--log4jdbc -->
<logger name="jdbc.sqltiming" level="DEBUG"/>
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="rollingFile"/>
<appender-ref ref="errorFile"/>
</root>
</configuration>

View File

@ -0,0 +1,8 @@
/**
* @author fancl
* @desc:
* @date 2023/12/18
*/
public class MonitorTest {
}