java - TimerTask n'est pas entièrement exécuté avec succès
世界只因有你
世界只因有你 2017-06-28 09:24:54
0
1
952

J'ai créé une classe TimerManager pour permettre au système d'exécuter les quatre tâches correspondantes après son exécution. Cependant, seules deux des quatre tâches ont été exécutées avec succès, à savoir timer et timer3, et les deux tâches suivantes, timer2 et timer4, n'ont pas été exécutées. Je n'arrive pas à comprendre, alors je suis venu à SF pour vous demander de m'aider à découvrir quel est le problème. Voici le code de TimerManager :

.
public class TimerManager {
    @Resource
    RemoteControlController remoteControlController;
    
    @Resource
    ManagementStationService managementStationService;

    @Resource
    ControllerStatusController controllerStatusController;

    // 时间间隔
    private static final long PERIOD_DAY = 24 * 60 * 60 * 1000;
    public static final long PERIOD_DAY2 = 60 * 60 * 1000;
    private static final long PERIOD_DAY3 = 60 * 60 * 1000;
    private static final int START_TIME = 1;
    private static final int START_TIME2 = 0;
    private Logger log = Logger.getLogger("ServerInfo");

    public void initTimerManager() {
        Calendar calendar = Calendar.getInstance();
        Calendar calendar2 = Calendar.getInstance();

        /*** 定制每日1:00执行方法 ***/

        calendar.set(Calendar.HOUR_OF_DAY, START_TIME);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        


        /*** 定制每日0:00执行方法 ***/

        calendar2.set(Calendar.HOUR_OF_DAY, START_TIME2);
        calendar2.set(Calendar.MINUTE, 0);
        calendar2.set(Calendar.SECOND, 0);

        Date date = calendar.getTime(); //第一次执行定时任务的时间 ,date重启不执行
        Date date2 = calendar.getTime();//date2、3重启执行
        Date date3 = calendar2.getTime();

        // 如果第一次执行定时任务的时间 小于 当前的时间
        // 此时要在第一次执行定时任务的时间加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
        if (date.before(new Date())) {
            date = this.addDay(date, 1);
        }

        Timer timer = new Timer();
        Timer timer2 = new Timer();
        Timer timer3 = new Timer();
        Timer timer4 = new Timer();

        UpdateDailyEletricPowerTimerTask task = new UpdateDailyEletricPowerTimerTask();
        UpdateLampStatusTimerTask task2 = new UpdateLampStatusTimerTask();
        UpdateCurrentEletricDataTimerTask task3 = new UpdateCurrentEletricDataTimerTask();
        UpdateCurrentControllerStatusTimerTask task4 = new UpdateCurrentControllerStatusTimerTask();
        
        // 安排指定的任务在指定的时间开始进行重复的固定延迟执行。
        timer.schedule(task, date, PERIOD_DAY);
        timer3.schedule(task3, date3, PERIOD_DAY2);
        timer4.schedule(task4, date3, PERIOD_DAY3);//先更新路由状态
        timer2.schedule(task2, date2, PERIOD_DAY);//再更新灯状态
    }

    // 增加或减少天数
    public Date addDay(Date date, int num) {
        Calendar startDT = Calendar.getInstance();
        startDT.setTime(date);
        startDT.add(Calendar.DAY_OF_MONTH, num);
        return startDT.getTime();
    }
    
    public class UpdateCurrentEletricDataTimerTask extends TimerTask {

        @Override
        public void run() {
            try {
                // 在这里写你要执行的内容
                /**
                 * 查询实时功率等数据
                 */
                log.info("-------------UpdateCurrentEletricDataTimerTask正在执行--------------");
                remoteControlController.currentElectricDataCollecting();

                log.info("-------------UpdateCurrentEletricDataTimerTask执行完毕--------------");
            } catch (Exception e) {
                log.info("-------------UpdateCurrentEletricDataTimerTask解析信息发生异常--------------");
            }
        }
    }
public class UpdateCurrentControllerStatusTimerTask extends TimerTask {

        @Override
        public void run() {
            try {
                // 在这里写你要执行的内容
                /**
                 * 查询实时功率等数据
                 */
                log.info("-------------UpdateCurrentControllerStatusTimerTask正在执行--------------");
                remoteControlController.readRouterStatus();

                log.info("-------------UpdateCurrentControllerStatusTimerTask执行完毕--------------");
            } catch (Exception e) {
                log.info("-------------UpdateCurrentControllerStatusTimerTask解析信息发生异常--------------");
            }
        }
    }
    
    public class UpdateDailyEletricPowerTimerTask extends TimerTask {

        @Override
        public void run() {
            try {
                // 在这里写你要执行的内容
                /**
                 * 查询前昨两天日冻结正向有功总电量
                 */
                log.info("-------------UpdateDailyEletricPowerTimerTask正在执行--------------");
                remoteControlController.dailyPositiveElectricPowerCollecting();
                log.info("-------------UpdateDailyEletricPowerTimerTask执行完毕--------------");

            } catch (Exception e) {
                log.info("-------------UpdateDailyEletricPowerTimerTask解析信息发生异常--------------");
            }
        }
    }
    
    public class UpdateLampStatusTimerTask extends TimerTask {

        @Override
        public void run() {
            try {
                // 在这里写你要执行的内容
                /**
                 * 更新全部灯具状态
                 */
                log.info("-------------UpdateLampStatusTimerTask正在执行--------------");
                List<ManagementStation> mlist = managementStationService.getManagementStationList();
                int msize = mlist.size();
                log.info("**********UpdateLampStatusTimerTask获取的管理所长度为"+msize);
                if(msize > 0){
                    String[] arr = new String[msize];
                    for(int i = 0; i < msize; i++)
                        arr[i] = String.valueOf(mlist.get(i).getMid());
                    boolean realTime = false;
                    controllerStatusController.UpdateControllerStatus(arr,realTime);
                }
                log.info("-------------UpdateLampStatusTimerTask执行完毕-------------");

            } catch (Exception e) {
                log.info("-------------UpdateLampStatusTimerTask解析信息发生异常--------------");
            }
        }
    }
}
世界只因有你
世界只因有你

répondre à tous(1)
仅有的幸福

Je n'ai jamais utilisé Timer et je ne vais pas donner de conseils sur la façon de déboguer ce programme. Je recommande d'utiliser un cadre mature comme le quartz pour ce genre de chose. Si vous devez le concevoir vous-même, Timer n'est pas le meilleur choix. L'idée standard devrait être :

.
  1. Créez un thread démon pour gérer le cycle de chaque tâche planifiée

  2.  ;
  3. Lorsque le temps d'exécution d'une tâche planifiée est écoulé, le thread démon ouvre un autre thread pour exécuter la tâche

  4.  ;
  5. Si le temps d'exécution d'une tâche dépasse le cycle, le prochain temps d'exécution sera reporté au cycle suivant.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal