java springboot 實現定時器任務

hanchufeng2020發表於2020-10-20

這兩天在做一個物聯網的專案,裝置是智慧斷漏器,使用場景,固定時間關閉,固定時間開啟。也就是固定時間開電,固定時間關電。設定了一個一張表用於儲存需要執行的任務。介面如下:

根據上邊提供的時間,如果時間到了,就執行呼叫裝置對應的遠端控制指令。但是,需要有一個定時器實時監測。

如下便是關於 springboot 的@Scheduled 定時器

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.ruoyi.system.domain.FireLeakbreakerTimer;
import com.ruoyi.system.service.IFireLeakbreakerDeviceService;
import com.ruoyi.system.service.IFireLeakbreakerTimerService;
/***
 * 斷漏器定時開關
 * @author jason
 *
 */
@Component 
@Configuration
@EnableScheduling //啟用排程器
public class ScheduleJobInitListenerLeakBreaker{
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Autowired
    IFireLeakbreakerTimerService iFireLeakbreakerTimerService;
    @Autowired
    IFireLeakbreakerDeviceService iFireLeakbreakerDeviceService;
    @Scheduled(cron="0 */5 * * * ?") //這裡是沒5分鐘執行一次
    public  void run() throws Exception {
        logger.info("ScheduleJobInitListenerLeakBreaker start .... ");
        FireLeakbreakerTimer fireLeakbreakerTimer = new FireLeakbreakerTimer();
        //批量開啟
        List<FireLeakbreakerTimer>  openList =  iFireLeakbreakerTimerService.selectFireLeakbreakerTimerListByOpenTime();//這裡查詢對應的任務資訊
        for (FireLeakbreakerTimer fireLeakbreakerTimer2 : openList) {
            if(fireLeakbreakerTimer2.getNextOpenTimer().after(new Date())){
                //呼叫開啟指令。
                iFireLeakbreakerDeviceService.openDeviceCommand(fireLeakbreakerTimer2.getDeviceId()+"");
                //更新斷漏器定時任務下次開啟時間
                fireLeakbreakerTimer2.setNextOpenTimer(getDate(fireLeakbreakerTimer2.getOpenTimerHour(),fireLeakbreakerTimer2.getOpenTimerMinute()));
                iFireLeakbreakerTimerService.updateFireLeakbreakerTimer(fireLeakbreakerTimer2);
            }
        }
        //批量關閉
        List<FireLeakbreakerTimer>  closeList =  iFireLeakbreakerTimerService.selectFireLeakbreakerTimerListByCloseTime();//這裡查詢對應的任務資訊
        for (FireLeakbreakerTimer fireLeakbreakerTimer2 : closeList) {
            if(fireLeakbreakerTimer2.getNextOpenTimer().after(new Date())){
                //呼叫關閉指令。
                iFireLeakbreakerDeviceService.closeDeviceCommand(fireLeakbreakerTimer2.getDeviceId()+"");
                //更新斷漏器定時任務下次關閉時間
                fireLeakbreakerTimer2.setNextCloseTimer(getDate(fireLeakbreakerTimer2.getCloseTimerHour(),fireLeakbreakerTimer2.getCloseTimerMinute()));
                iFireLeakbreakerTimerService.updateFireLeakbreakerTimer(fireLeakbreakerTimer2);
            }
            
        }
    }
    /***
     * 獲取當天時間並且天數加1,加上傳入的小時和分鐘
     * @param hours
     * @param minute
     * @return
     * @throws ParseException
     */
    private   Date getDate(String hours,String minute) throws ParseException{
         Calendar cal = Calendar.getInstance();
         cal.add(Calendar.DATE, 1);
         int day = cal.get(Calendar.DATE);
         int month = cal.get(Calendar.MONTH) + 1;
         int year = cal.get(Calendar.YEAR);
        String date  =  year+"-"+month+"-"+day+" " +hours+":"+minute;
        SimpleDateFormat dateFormat  = new SimpleDateFormat("YYYY-MM-dd HH:mm");
        return dateFormat.parse(date);
    }
    
}

相關文章