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().eq("code", "notifyEnable")); if(notifyEnableConfig == null){ return; } String notifyEnable = notifyEnableConfig.getValue(); if (!notifyEnable.equals("Y")) { return; } Config notifyUriConfig = configService.selectOne(new EntityWrapper().eq("code", "notifyUri")); if(notifyUriConfig == null){ return; } String notifyUri = notifyUriConfig.getValue(); Config notifyUriPathConfig = configService.selectOne(new EntityWrapper().eq("code", "notifyUriPath")); if(notifyUriPathConfig == null){ return; } String notifyUriPath = notifyUriPathConfig.getValue(); List 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(); apiLog.setUrl(customData.getUri() + customData.getPath()); apiLog.setRequest(customData.getData()); apiLog.setCreateTime(new Date()); response = new HttpHandler.Builder() .setUri(customData.getUri()) .setPath(customData.getPath()) .setJson(customData.getData()) .build() .doPost(); }else { apiLog.setUrl(notifyUri + notifyUriPath); apiLog.setRequest(JSON.toJSONString(notifyDto)); apiLog.setCreateTime(new Date()); response = new HttpHandler.Builder() .setUri(notifyUri) .setPath(notifyUriPath) .setJson(JSON.toJSONString(notifyDto)) .build() .doPost(); } 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; } } }