1、预警定时初始化任务分离到job模块

2、巨坑:
@GetMapping("/apistatistics/")
    R<List<ApiRecord>> selectApiRecordListForRPC();
    获取这个返回值一直降级,改成R<JSONArray>就没问题了
This commit is contained in:
xjs 2022-01-25 19:50:40 +08:00
parent 465b67df50
commit aca0abf08f
8 changed files with 223 additions and 97 deletions

View File

@ -1,5 +1,6 @@
package com.xjs.business.warning; package com.xjs.business.warning;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.constant.ServiceNameConstants;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.xjs.business.warning.domain.ApiRecord; import com.xjs.business.warning.domain.ApiRecord;
@ -24,23 +25,26 @@ import java.util.List;
fallbackFactory = RemoteWarningCRUDFactory.class) fallbackFactory = RemoteWarningCRUDFactory.class)
public interface RemoteWarningCRUDFeign { public interface RemoteWarningCRUDFeign {
@PostMapping("apiwarning") @PostMapping("/apiwarning")
R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord); R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord);
@PutMapping("apiwarning") @PutMapping("/apiwarning")
R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord); R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord);
@GetMapping("apiwarning") @GetMapping("/apiwarning")
R<List<ApiRecord>> selectApiRecordListForRPC(@SpringQueryMap ApiRecord apiRecord); R<List<ApiRecord>> selectApiRecordListForRPC(@SpringQueryMap ApiRecord apiRecord);
@PostMapping("apiwarning/saveApiwarningForRPC") @PostMapping("/apiwarning/saveApiwarningForRPC")
R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning); R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning);
@GetMapping("apiwarning/getApiNameForRPC") @GetMapping("/apiwarning/getApiNameForRPC")
R<List<String>> getApiName(); R<List<String>> getApiName();
@GetMapping("apistatistics") @GetMapping("/apistatistics/")
R<List<ApiRecord>> selectApiRecordListForRPC(); R<List<ApiRecord>> selectApiRecordListForRPC();
@GetMapping("/apiwarning/findRecordListForRPC")
R<JSONArray> findRecordListForRPC();
} }

View File

@ -1,5 +1,6 @@
package com.xjs.business.warning.factory; package com.xjs.business.warning.factory;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
import com.xjs.business.warning.RemoteWarningCRUDFeign; import com.xjs.business.warning.RemoteWarningCRUDFeign;
import com.xjs.business.warning.domain.ApiRecord; import com.xjs.business.warning.domain.ApiRecord;
@ -59,6 +60,12 @@ public class RemoteWarningCRUDFactory implements FallbackFactory<RemoteWarningCR
log.error("调用预警服务api统计查询所有api接口失败执行降级处理----"); log.error("调用预警服务api统计查询所有api接口失败执行降级处理----");
return R.fail(); return R.fail();
} }
@Override
public R<JSONArray> findRecordListForRPC() {
log.error("调用预警服务api预警查询所有api接口失败执行降级处理----");
return R.fail();
}
}; };
} }
} }

View File

@ -35,7 +35,7 @@ public class CopyWritingTask {
log.info("文案定时任务结果:code={},msg={},data={}",r.getCode(),r.getMsg(),r.getData()); log.info("文案定时任务结果:code={},msg={},data={}",r.getCode(),r.getMsg(),r.getData());
LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime(); LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime();
long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2); long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2);
log.info("Job耗费时间:{}ms", between); log.info("文案定时任务Job耗费时间:{}ms", between);
log.info("---------------文案定时任务end---------------------"); log.info("---------------文案定时任务end---------------------");
} }
} }

View File

@ -0,0 +1,69 @@
package com.xjs.job.task;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.R;
import com.xjs.business.warning.RemoteWarningCRUDFeign;
import com.xjs.business.warning.domain.ApiRecord;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Date;
import java.util.List;
/**
* 预警相关定时任务
*
* @author xiejs
* @since 2022-01-25
*/
@Component("WarningTask")
@Log4j2
public class WarningTask {
@Resource
private RemoteWarningCRUDFeign remoteWarningCRUDFeign;
/**
* 处理预警api信息的每天调用次数
*/
public void handleRecordDate() {
LocalDateTime localDateTime1 = DateUtil.date().toLocalDateTime();
log.info("---------------预警次数初始化定时任务Start-------------------");
R<JSONArray> listR = remoteWarningCRUDFeign.findRecordListForRPC();
log.info("预警次数初始化定时任务结果:code={},msg={},data={}",listR.getCode(),listR.getMsg(),listR.getData());
JSONArray jsonArray = listR.getData();
List<ApiRecord> recordList = jsonArray.toJavaList(ApiRecord.class);
List<ApiRecord> handleDate = this.handleDate(recordList);
handleDate.forEach(data -> {
remoteWarningCRUDFeign.updateApiRecordForRPC(data);
});
LocalDateTime localDateTime2 = DateUtil.date().toLocalDateTime();
long between = ChronoUnit.MILLIS.between(localDateTime1, localDateTime2);
log.info("文案定时任务Job耗费时间:{}ms", between);
log.info("---------------预警次数初始化定时任务end---------------------");
}
protected List<ApiRecord> handleDate(List<ApiRecord> apiRecordList) {
if (CollUtil.isNotEmpty(apiRecordList)) {
apiRecordList.forEach(apiRecord -> {
String dateTime = DateUtil.formatDateTime(apiRecord.getUpdateTime());
Date date = DateUtil.parseDate(dateTime).toJdkDate();
//当前时间和最后一次修改时间间隔天数超过1 就清零
long compareTime = DateUtil.between(date, new Date(), DateUnit.DAY);
if (compareTime > 0) {
apiRecord.setDayCount(0L);
}
});
}
return apiRecordList;
}
}

View File

@ -0,0 +1,13 @@
<template>
</template>
<script>
export default {
name: "WeatherStatistics"
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,16 @@
package com.xjs.controller;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 天气统计controller
* @author xiejs
* @since 2022-01-25
*/
@RestController
@RequestMapping("weatherstatistics")
@Api(tags = "业务模块-天气记录统计")
public class WeatherStatisticsController {
}

View File

@ -1,5 +1,6 @@
package com.xjs.controller; package com.xjs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.domain.R;
@ -44,54 +45,6 @@ public class ApiWarningController extends BaseController {
@Autowired @Autowired
private RedisService redisService; private RedisService redisService;
/**
* 远程保存 apiRecord
*
* @param apiRecord api记录
* @return apiRecord
*/
@PostMapping
@ApiOperation("远程保存预警信息")
public R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord) {
return apiWarningService.saveApiRecord(apiRecord) ? R.ok() : R.fail();
}
/**
* 远程修改
*
* @param apiRecord api记录
* @return ApiRecord
*/
@PutMapping
@ApiOperation("远程修改预警信息")
public R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord) {
return apiWarningService.updateApiRecordByUrl(apiRecord) ? R.ok() : R.fail();
}
/**
* 远程查询api记录信息
*
* @param apiRecord
* @return R<List < ApiRecord>>
*/
@GetMapping
@ApiOperation("远程查询预警信息")
public R<List<ApiRecord>> selectApiRecordListForRPC(ApiRecord apiRecord) {
List<ApiRecord> apiRecords = apiWarningService.selectApiRecordListByUrl(apiRecord);
return R.ok(apiRecords);
}
/**
* 远程获取所有Api名称
* @return api名称
*/
@GetMapping("getApiNameForRPC")
@ApiOperation("远程获取所有Api名称")
public R<List<String>> getApiName() {
List<String> apiNameList = apiWarningService.getApiName();
return R.ok(apiNameList);
}
/** /**
* 处理预警单个预警 * 处理预警单个预警
* @param id 预警id * @param id 预警id
@ -108,46 +61,6 @@ public class ApiWarningController extends BaseController {
return apiWarningService.updateById(apiWarning)?R.ok():R.fail(); return apiWarningService.updateById(apiWarning)?R.ok():R.fail();
} }
/**
* 远程保存api预警信息并websocket推送
*
* @param apiWarning 预警实体类
* @return R
*/
@PostMapping("saveApiwarningForRPC")
@Transactional
@ApiOperation("远程保存api预警信息并websocket推送")
public R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning) {
boolean save = apiWarningService.save(apiWarning);
this.websocketPush(apiWarning);
return save ? R.ok() : R.fail();
}
/**
* websocket推送
*/
private void websocketPush(ApiWarning apiWarning) {
long count = apiWarningService.count(new QueryWrapper<ApiWarning>().eq("handle",NO));
Set<String> cacheSet = redisService.getCacheSet(WEBSOCKET);
JSONObject jsonData =new JSONObject();
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(apiWarning);
//把id设置成字符串防止前端精度丢失
jsonObject.put("id", apiWarning.getId().toString());
jsonData.put("count", count);
jsonData.put("data", jsonObject.toJSONString());
jsonData.put("socketType", "apiWarning");
for (String userId : cacheSet) {
try {
WebSocketServer.sendInfo(jsonData.toString(),userId);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
/** /**
* 查询api预警列表 * 查询api预警列表
*/ */
@ -195,6 +108,108 @@ public class ApiWarningController extends BaseController {
} }
//--------------------内部调用rpc-----------------------------------
/**
* 远程保存 apiRecord
*
* @param apiRecord api记录
* @return apiRecord
*/
@PostMapping
@ApiOperation("远程保存预警信息")
public R<ApiRecord> saveApiRecordForRPC(@RequestBody ApiRecord apiRecord) {
return apiWarningService.saveApiRecord(apiRecord) ? R.ok() : R.fail();
}
/**
* 远程修改
*
* @param apiRecord api记录
* @return ApiRecord
*/
@PutMapping
@ApiOperation("远程修改预警信息")
public R<ApiRecord> updateApiRecordForRPC(@RequestBody ApiRecord apiRecord) {
return apiWarningService.updateApiRecordByUrl(apiRecord) ? R.ok() : R.fail();
}
/**
* 远程查询api记录信息
*
* @param apiRecord
* @return R<List < ApiRecord>>
*/
@GetMapping
@ApiOperation("远程查询预警信息")
public R<List<ApiRecord>> selectApiRecordListForRPC(ApiRecord apiRecord) {
List<ApiRecord> apiRecords = apiWarningService.selectApiRecordListByUrl(apiRecord);
return R.ok(apiRecords);
}
@GetMapping("findRecordListForRPC")
@ApiOperation("远程查询预警信息")
public R<JSONArray> findRecordListForRPC() {
List<ApiRecord> apiRecordList = apiWarningService.selectApiRecordList(new ApiRecord());
JSONArray jo= (JSONArray) JSONArray.toJSON(apiRecordList);
return R.ok(jo);
}
/**
* 远程获取所有Api名称
* @return api名称
*/
@GetMapping("getApiNameForRPC")
@ApiOperation("远程获取所有Api名称")
public R<List<String>> getApiName() {
List<String> apiNameList = apiWarningService.getApiName();
return R.ok(apiNameList);
}
/**
* 远程保存api预警信息并websocket推送
*
* @param apiWarning 预警实体类
* @return R
*/
@PostMapping("saveApiwarningForRPC")
@Transactional
@ApiOperation("远程保存api预警信息并websocket推送")
public R<ApiWarning> saveApiWarningForRPC(@RequestBody ApiWarning apiWarning) {
boolean save = apiWarningService.save(apiWarning);
this.websocketPush(apiWarning);
return save ? R.ok() : R.fail();
}
/**
* websocket推送
*/
private void websocketPush(ApiWarning apiWarning) {
long count = apiWarningService.count(new QueryWrapper<ApiWarning>().eq("handle",NO));
Set<String> cacheSet = redisService.getCacheSet(WEBSOCKET);
JSONObject jsonData =new JSONObject();
JSONObject jsonObject = (JSONObject) JSONObject.toJSON(apiWarning);
//把id设置成字符串防止前端精度丢失
jsonObject.put("id", apiWarning.getId().toString());
jsonData.put("count", count);
jsonData.put("data", jsonObject.toJSONString());
jsonData.put("socketType", "apiWarning");
for (String userId : cacheSet) {
try {
WebSocketServer.sendInfo(jsonData.toString(),userId);
} catch (IOException e) {
logger.error(e.getMessage());
}
}
}
//-------------------------代码生成------------------------------------ //-------------------------代码生成------------------------------------

View File

@ -2,6 +2,7 @@ package com.xjs.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.utils.StringUtils;
import com.xjs.domain.ApiRecord; import com.xjs.domain.ApiRecord;
import com.xjs.domain.ApiWarning; import com.xjs.domain.ApiWarning;
import com.xjs.exception.BusinessException; import com.xjs.exception.BusinessException;
@ -51,8 +52,9 @@ public class ApiWarningServiceImpl extends ServiceImpl<ApiWarningMapper, ApiWarn
@Override @Override
public List<ApiRecord> selectApiRecordListByUrl(ApiRecord apiRecord) { public List<ApiRecord> selectApiRecordListByUrl(ApiRecord apiRecord) {
return apiRecordMapper return apiRecordMapper
.selectList(new QueryWrapper<ApiRecord>().eq("api_name", apiRecord.getApiName()) .selectList(new QueryWrapper<ApiRecord>()
.eq("api_name", apiRecord.getApiName())); .eq(StringUtils.isNotEmpty(apiRecord.getApiName()),"api_name", apiRecord.getApiName())
.eq(StringUtils.isNotEmpty(apiRecord.getApiUrl()),"api_url", apiRecord.getApiUrl()));
} }
@Override @Override