DeviceHealthProbeJob.java 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package com.kym.admin.jobs;
  2. import com.kym.entity.WashDevice;
  3. import com.kym.service.DeviceHealthProbeService;
  4. import com.kym.service.WashDeviceService;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.springframework.scheduling.annotation.Async;
  7. import org.springframework.scheduling.annotation.Scheduled;
  8. import org.springframework.stereotype.Component;
  9. import java.util.List;
  10. /**
  11. * 设备健康探测定时任务
  12. * 主动查询故障状态设备的连通性,探测到设备在线则触发自动恢复
  13. *
  14. * @author skyline
  15. */
  16. @Slf4j
  17. @Component
  18. public class DeviceHealthProbeJob {
  19. private final WashDeviceService washDeviceService;
  20. private final DeviceHealthProbeService deviceHealthProbeService;
  21. public DeviceHealthProbeJob(WashDeviceService washDeviceService,
  22. DeviceHealthProbeService deviceHealthProbeService) {
  23. this.washDeviceService = washDeviceService;
  24. this.deviceHealthProbeService = deviceHealthProbeService;
  25. }
  26. /**
  27. * 每3分钟扫描所有故障状态设备,主动探测连通性
  28. */
  29. @Async("AsyncExecutor")
  30. @Scheduled(cron = "0 */3 * * * ?")
  31. public void probeFaultDevices() {
  32. log.debug("设备健康探测-开始");
  33. List<WashDevice> faultDevices = washDeviceService.lambdaQuery()
  34. .eq(WashDevice::getState, WashDevice.STATE_故障)
  35. .list();
  36. if (faultDevices.isEmpty()) {
  37. log.debug("设备健康探测-无故障设备");
  38. return;
  39. }
  40. log.info("设备健康探测-发现 {} 个故障设备,开始探测", faultDevices.size());
  41. int recovered = 0;
  42. for (WashDevice device : faultDevices) {
  43. try {
  44. if (deviceHealthProbeService.probeAndRecover(device)) {
  45. recovered++;
  46. }
  47. } catch (Exception e) {
  48. log.error("设备健康探测-设备 {} 探测异常", device.getDeviceName(), e);
  49. }
  50. }
  51. log.info("设备健康探测-结束,共探测 {} 个故障设备,恢复 {} 个", faultDevices.size(), recovered);
  52. }
  53. }