| 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.NotifyDto; | 
| import com.zy.asrs.entity.HttpRequestLog; | 
| import com.zy.asrs.service.HttpRequestLogService; | 
| import com.zy.asrs.utils.NotifyUtils; | 
| import com.zy.common.utils.HttpHandler; | 
| import com.zy.common.utils.RedisUtil; | 
| import com.zy.core.enums.SlaveType; | 
| import com.zy.core.model.ForkLiftSlave; | 
| import com.zy.core.model.ShuttleSlave; | 
| 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 HttpRequestLogService httpRequestLogService; | 
|   | 
|     @Scheduled(cron = "0/3 * * * * ? ") | 
|     public synchronized void notifyShuttle(){ | 
|         for (ShuttleSlave slave : slaveProperties.getShuttle()) { | 
|             notifyMsg(String.valueOf(SlaveType.Shuttle), slave.getId()); | 
|         } | 
|     } | 
|   | 
|     @Scheduled(cron = "0/3 * * * * ? ") | 
|     public synchronized void notifyForkLift(){ | 
|         for (ForkLiftSlave slave : slaveProperties.getForkLift()) { | 
|             notifyMsg(String.valueOf(SlaveType.ForkLift), slave.getId()); | 
|         } | 
|     } | 
|   | 
|     @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; | 
|             } | 
|   | 
|             HttpRequestLog httpRequestLog = new HttpRequestLog(); | 
|             httpRequestLog.setName(notifyUri + notifyUriPath); | 
|             httpRequestLog.setRequest(JSON.toJSONString(notifyDto)); | 
|             httpRequestLog.setCreateTime(new Date()); | 
|   | 
|             try { | 
|                 //触发通知 | 
|                 String response = new HttpHandler.Builder() | 
|                         .setUri(notifyUri) | 
|                         .setPath(notifyUriPath) | 
|                         .setJson(JSON.toJSONString(notifyDto)) | 
|                         .build() | 
|                         .doPost(); | 
|                 httpRequestLog.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 { | 
|                 //保存记录 | 
|                 httpRequestLogService.insert(httpRequestLog); | 
|             } | 
|   | 
|             //通知失败 | 
|             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; | 
|         } | 
|     } | 
|   | 
| } |