EcsJob.java 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package com.fdkankan.modeling.job;
  2. import com.fdkankan.modeling.constants.SysConstants;
  3. import com.fdkankan.rubbersheeting.RubberSheetingUtil;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.util.ObjectUtils;
  9. import javax.annotation.PostConstruct;
  10. import java.util.Random;
  11. import java.util.concurrent.Executors;
  12. import java.util.concurrent.TimeUnit;
  13. @Component
  14. public class EcsJob {
  15. private static final Logger log = LoggerFactory.getLogger(EcsJob.class);
  16. @Autowired
  17. private RubberSheetingUtil rubberSheetingUtil;
  18. @PostConstruct
  19. public void deleteEcs() {
  20. if (SysConstants.isResidenceService) {
  21. log.info("此服务是常驻服务,不启动关闭弹性伸缩定时任务!");
  22. return;
  23. }
  24. log.info("此服务非常驻服务,开始启动关闭弹性伸缩定时任务");
  25. Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(() -> {
  26. // 判断是否有任务执行
  27. if (SysConstants.SYSTEM_BUILDING) {
  28. log.error("{} 服务构建中,退出停止服务请求!", SysConstants.hostName);
  29. return;
  30. }
  31. log.info("服务未构建,准备停止服务!");
  32. if (!SysConstants.executorService.isShutdown()) {
  33. SysConstants.SYSTEM_OFFING = true;
  34. if (!SysConstants.SYSTEM_BUILDING) {
  35. SysConstants.executorService.shutdown();
  36. log.error("{} 线程池关闭,不接受新的构建请求!", SysConstants.hostName);
  37. }else{
  38. SysConstants.SYSTEM_OFFING = false;
  39. log.error("{} 服务构建中,退出停止服务请求!", SysConstants.hostName);
  40. }
  41. }
  42. // 因为 阿里云同一时间不能删除多台实例,因此做随机睡眠,错开时间。
  43. try {
  44. Thread.sleep((new Random().nextInt(30) + 10) * 1000);
  45. } catch (InterruptedException e) {
  46. e.printStackTrace();
  47. }
  48. // 没有任务执行时,则退出
  49. if (SysConstants.executorService.isShutdown() && SysConstants.executorService.isTerminated()) {
  50. log.error("{} 请求阿里云关闭弹性伸缩", SysConstants.hostName);
  51. String result = null;
  52. int tryTimes = -1;
  53. do {
  54. tryTimes++;
  55. result = rubberSheetingUtil.deleteEcs(SysConstants.hostName);
  56. if (ObjectUtils.isEmpty(result)) {
  57. int time = new Random().nextInt(10) + 30;
  58. log.error("{} 关闭弹性伸缩失败,{}秒后重试", SysConstants.hostName, time);
  59. try {
  60. Thread.sleep(time * 1000);
  61. } catch (InterruptedException e) {
  62. e.printStackTrace();
  63. }
  64. }
  65. } while (ObjectUtils.isEmpty(result) && tryTimes < 5);
  66. log.error("{} 关闭弹性伸缩成功!", SysConstants.hostName);
  67. } else {
  68. log.error("{} 服务构建中,退出删除程序失败!", SysConstants.hostName);
  69. }
  70. },
  71. 50, 60, TimeUnit.MINUTES);
  72. }
  73. }