1、预警定时初始化任务分离到job模块
2、巨坑:
@GetMapping("/apistatistics/")
R<List<ApiRecord>> selectApiRecordListForRPC();
获取这个返回值一直降级,改成R<JSONArray>就没问题了
This commit is contained in:
parent
465b67df50
commit
aca0abf08f
|
|
@ -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();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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---------------------");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
<template>
|
||||||
|
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: "WeatherStatistics"
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
|
@ -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 {
|
||||||
|
}
|
||||||
|
|
@ -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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//-------------------------代码生成------------------------------------
|
//-------------------------代码生成------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue