OfflineNotifyJob.java 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package com.kym.admin.jobs;
  2. import cn.hutool.extra.mail.MailUtil;
  3. import com.kym.common.utils.CommUtil;
  4. import com.kym.entity.common.RedisKeys;
  5. import com.kym.service.cache.KymCache;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.apache.commons.lang3.StringUtils;
  8. import org.springframework.beans.factory.annotation.Value;
  9. import org.springframework.data.redis.core.StringRedisTemplate;
  10. import org.springframework.scheduling.annotation.Scheduled;
  11. import org.springframework.stereotype.Component;
  12. import java.util.ArrayList;
  13. import java.util.Comparator;
  14. import java.util.Map;
  15. import java.util.Set;
  16. import java.util.stream.Collectors;
  17. /**
  18. * @author skyline
  19. * @description 设备离线通知
  20. * @date 2023-09-30 16:15
  21. */
  22. @Component
  23. @Slf4j
  24. public class OfflineNotifyJob {
  25. private final StringRedisTemplate redisTemplate;
  26. @Value("${kym.notify-email}")
  27. private String notifyEmail;
  28. public OfflineNotifyJob(StringRedisTemplate redisTemplate) {
  29. this.redisTemplate = redisTemplate;
  30. }
  31. // 每小时的第30分钟执行一次
  32. // @Scheduled(cron = "0 30 0/1 * * ? ")
  33. public void execute() {
  34. // 查询redis离线设备消息队列,存在且超过1小时的消息则发送邮件提醒
  35. Set<String> offlineList = redisTemplate.opsForZSet().rangeByScore(RedisKeys.OFFLINE, System.currentTimeMillis() - 60 * 60 * 1000, System.currentTimeMillis() + 60 * 60 * 1000);
  36. if (!CommUtil.isEmptyOrNull(offlineList)) {
  37. /*
  38. * 格式:
  39. * 【设备离线通知】
  40. * 【阳光科创中心】:001001,001002,001003
  41. * 【阳光粤海家园】:002001,002002,002003
  42. */
  43. var temp = "【%s】:%s\n";
  44. var map = new ArrayList<String>(offlineList).stream()
  45. .collect(Collectors.toMap(KymCache.INSTANCE::getShortIdByEquipmentIdOrConnectorId, KymCache.INSTANCE::getStationNameByConnectorId));
  46. // 以站点名称分组
  47. var list = map.entrySet().stream().collect(Collectors.groupingBy(Map.Entry::getValue));
  48. StringBuilder sb = new StringBuilder();
  49. list.forEach((k, v) -> sb.append(temp.formatted(k, StringUtils.join(v.stream().map(Map.Entry::getKey).sorted(Comparator.comparingInt(Integer::parseInt)).toList(), ","))));
  50. log.warn(sb.toString());
  51. // 格式化信息,发送邮件
  52. MailUtil.send(notifyEmail, "【设备离线通知】", sb.toString(), false);
  53. redisTemplate.opsForZSet().remove(RedisKeys.OFFLINE, offlineList.toArray(Object[]::new));
  54. redisTemplate.opsForSet().add(RedisKeys.OFFLINE_EXPIRED, offlineList.toArray(String[]::new));
  55. }
  56. }
  57. }