package com.zy.asrs.task;
|
|
import com.alibaba.fastjson.JSON;
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.mapper.EntityWrapper;
|
import com.zy.asrs.domain.dto.NotifyCustomDataDto;
|
import com.zy.asrs.domain.dto.NotifyDto;
|
import com.zy.asrs.entity.ApiLog;
|
import com.zy.asrs.service.ApiLogService;
|
import com.zy.asrs.utils.NotifyUtils;
|
import com.zy.common.utils.HttpHandler;
|
import com.zy.common.utils.RedisUtil;
|
import com.zy.core.properties.SlaveProperties;
|
import com.zy.system.entity.Config;
|
import com.zy.system.service.ConfigService;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
|
import java.util.Date;
|
import java.util.List;
|
|
@Component
|
@Slf4j
|
public class NotifyScheduler {
|
|
@Autowired
|
private RedisUtil redisUtil;
|
@Autowired
|
private NotifyUtils notifyUtils;
|
@Autowired
|
private SlaveProperties slaveProperties;
|
@Autowired
|
private ConfigService configService;
|
@Autowired
|
private ApiLogService apiLogService;
|
|
@Scheduled(cron = "0/3 * * * * ? ")
|
public synchronized void notifyTask(){
|
notifyMsg("task", 1);
|
}
|
|
private synchronized void notifyMsg(String notifyType, Integer device) {
|
Config notifyEnableConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyEnable"));
|
if(notifyEnableConfig == null){
|
return;
|
}
|
String notifyEnable = notifyEnableConfig.getValue();
|
if (!notifyEnable.equals("Y")) {
|
return;
|
}
|
|
Config notifyUriConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyUri"));
|
if(notifyUriConfig == null){
|
return;
|
}
|
String notifyUri = notifyUriConfig.getValue();
|
|
Config notifyUriPathConfig = configService.selectOne(new EntityWrapper<Config>().eq("code", "notifyUriPath"));
|
if(notifyUriPathConfig == null){
|
return;
|
}
|
String notifyUriPath = notifyUriPathConfig.getValue();
|
|
List<String> keys = notifyUtils.takeKeys(notifyType, device);
|
if(keys == null){
|
return;
|
}
|
|
if (keys.isEmpty()) {
|
return;
|
}
|
|
for (String key : keys) {
|
Object object = redisUtil.get(key);
|
if (object == null) {
|
continue;
|
}
|
NotifyDto notifyDto = (NotifyDto) object;
|
|
if (System.currentTimeMillis() - notifyDto.getLastRetryTime() < 1000 * notifyDto.getRetryTime()) {
|
continue;
|
}
|
|
ApiLog apiLog = new ApiLog();
|
|
try {
|
//触发通知
|
String response = null;
|
if (notifyDto.getSendCustomData()) {
|
//自定义消息格式
|
NotifyCustomDataDto customData = notifyDto.getCustomData();
|
response = new HttpHandler.Builder()
|
.setUri(customData.getUri())
|
.setPath(customData.getPath())
|
.setJson(customData.getData())
|
.build()
|
.doPost();
|
|
apiLog.setUrl(customData.getUri() + customData.getPath());
|
apiLog.setRequest(customData.getData());
|
apiLog.setCreateTime(new Date());
|
}else {
|
response = new HttpHandler.Builder()
|
.setUri(notifyUri)
|
.setPath(notifyUriPath)
|
.setJson(JSON.toJSONString(notifyDto))
|
.build()
|
.doPost();
|
|
apiLog.setUrl(notifyUri + notifyUriPath);
|
apiLog.setRequest(JSON.toJSONString(notifyDto));
|
apiLog.setCreateTime(new Date());
|
}
|
|
apiLog.setResponse(response);
|
|
JSONObject jsonObject = JSON.parseObject(response);
|
Integer code = jsonObject.getInteger("code");
|
if(code == 200){
|
//通知成功
|
redisUtil.del(key);
|
|
continue;
|
}
|
}catch (Exception e){
|
e.printStackTrace();
|
}finally {
|
//保存记录
|
apiLogService.insert(apiLog);
|
}
|
|
//通知失败
|
int times = notifyDto.getRetryTimes() + 1;
|
if (times >= notifyDto.getFailTimes()) {
|
//超过次数
|
redisUtil.del(key);
|
continue;
|
}
|
|
notifyDto.setLastRetryTime(System.currentTimeMillis());
|
notifyDto.setRetryTimes(times);
|
redisUtil.set(key, notifyDto);
|
continue;
|
}
|
}
|
|
}
|