XDApplication.java 13.3 KB
package com.bsth;

import com.bsth.data.BasicData;
import com.bsth.data.LineVersionsData;
import com.bsth.data.ThreadMonotor;
import com.bsth.data.car_out_info.UpdateDBThread;
import com.bsth.data.directive.DirectivesPstThread;
import com.bsth.data.forecast.SampleTimeDataLoader;
import com.bsth.data.gpsdata_v2.thread.GpsDataLoaderThread;
import com.bsth.data.gpsdata_v2.thread.OfflineMonitorThread;
import com.bsth.data.gpsdata_v2.thread.RfidDataLoaderThread;
import com.bsth.data.msg_queue.DirectivePushQueue;
import com.bsth.data.msg_queue.WebSocketPushQueue;
import com.bsth.data.safe_driv.SafeDrivDataLoadThread;
import com.bsth.data.schedule.DayOfSchedule;
import com.bsth.data.schedule.auto_exec.AutoExecScanThread;
import com.bsth.data.schedule.e_state_check.thread.FixedCheckStationCodeThread;
import com.bsth.data.schedule.edit_logs.SeiPstThread;
import com.bsth.data.schedule.late_adjust.ScheduleLateThread;
import com.bsth.data.schedule.signal.SchSiginUpdateDBThread;
import com.bsth.data.schedule.thread.CalcOilThread;
import com.bsth.data.schedule.thread.SchedulePstThread;
import com.bsth.data.schedule.thread.ScheduleRefreshThread;
import com.bsth.data.schedule.thread.SubmitToTrafficManage;
import com.bsth.util.DateUtils;
import com.bsth.util.Tools;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 线调大部分服务都在这里启动
 * Created by panzhao on 2017/5/14.
 */
@Component
public class XDApplication implements CommandLineRunner {

    Logger log = LoggerFactory.getLogger(this.getClass());

    @Autowired
    BasicData.BasicDataLoader basicDataLoader;
    @Autowired
    UpdateDBThread fcxxUpdateThread;
    @Autowired
    ScheduleRefreshThread scheduleRefreshThread;
    @Autowired
    SchedulePstThread schedulePstThread;
    @Autowired
    ScheduleLateThread scheduleLateThread;
    @Autowired
    SubmitToTrafficManage submitToTrafficManage;
    @Autowired
    CalcOilThread calcOilThread;
    @Autowired
    DirectivesPstThread directivesPstThread;
    @Autowired
    ThreadMonotor threadMonotor;
    @Autowired
    SeiPstThread seiPstThread;
    @Autowired
    SampleTimeDataLoader sampleTimeDataLoader;
    @Autowired
    SchSiginUpdateDBThread schSiginUpdateDBThread;
    @Autowired
    AutoExecScanThread autoExecScanThread;

    @Autowired
    GpsDataLoaderThread gpsDataLoader;
    @Autowired
    RfidDataLoaderThread rfidDataLoader;

    @Autowired
    OfflineMonitorThread offlineMonitorThread;

    @Autowired
    LineVersionsData lineVersionsData;

    /*@Autowired
    FixedEnableVerionsThread fixedEnableVerionsThread;*/

    @Autowired
    SafeDrivDataLoadThread safeDrivDataLoadThread;

    @Autowired
    FixedCheckStationCodeThread fixedCheckStationCodeThread;

    private static long timeDiff;
    private static long timeDiffTraffic;

    static {
        // 早上2:20
        timeDiff = (DateUtils.getTimestamp() + 1000 * 60 * 140) - System.currentTimeMillis();
        if (timeDiff < 0)
            timeDiff += (1000 * 60 * 60 * 24);
        // 早上07:00
        timeDiffTraffic = (DateUtils.getTimestamp() + 1000 * 60 * 60 * 7) - System.currentTimeMillis();
        if (timeDiffTraffic < 0)
            timeDiffTraffic += (1000 * 60 * 60 * 24);
    }

    @Override
    public void run(String... strings) throws Exception {
        try {
            Tools tools = new Tools("application.properties");
            String environment = tools.getValue("spring.profiles.active");
            //预先加载基础的对照数据
            basicDataLoader.loadAllData();
            switch (environment){
                case "dev":
                    devInit();
                    break;
                case "prod":
                    prodInit();
                    break;
                case "test":
                    testInit();
                    break;
                default:
                    break;
            }
        }catch (Exception e){
            log.error("线调后台启动出现异常!!", e);
            System.exit(1);
        }
    }

    @Autowired
    DayOfSchedule dayOfSchedule;
    public void devInit(){
        log.info("devInit...");
        ScheduledExecutorService sexec = Application.mainServices;
        //抓取GPS数据
        gpsDataLoader.setFlag(-1);
        //dayOfSchedule.dataRecovery();

        //安全驾驶
        sexec.scheduleWithFixedDelay(safeDrivDataLoadThread, 180, 10, TimeUnit.SECONDS);

        /** 线调业务 */
        sexec.scheduleWithFixedDelay(scheduleRefreshThread, 10, 120, TimeUnit.SECONDS);//班次更新线程
        sexec.scheduleWithFixedDelay(scheduleLateThread, 140, 20, TimeUnit.SECONDS);//检查班次误点
        sexec.scheduleWithFixedDelay(gpsDataLoader, 100, 2, TimeUnit.SECONDS);//抓取GPS数据
        //sexec.scheduleWithFixedDelay(rfidDataLoader, 5, 5, TimeUnit.SECONDS);//抓取RFID数据
        sexec.scheduleWithFixedDelay(fixedCheckStationCodeThread, 60, 60 * 5, TimeUnit.SECONDS);//检查班次站点编码

        sexec.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS);//GPS设备掉离线
        sexec.scheduleWithFixedDelay(schedulePstThread, 180, 10, TimeUnit.SECONDS);//班次延迟入库线程
        sexec.scheduleWithFixedDelay(seiPstThread, 180, 60, TimeUnit.SECONDS);//班次修正日志入库
        sexec.scheduleWithFixedDelay(directivesPstThread, 120, 60, TimeUnit.SECONDS);//调度指令延迟入库
        sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS);//线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作)
        sexec.scheduleWithFixedDelay(sampleTimeDataLoader, 140, 120 * 60, TimeUnit.SECONDS);//到离站预测需要的站点间耗时数据
        sexec.scheduleWithFixedDelay(basicDataLoader, 1, 1, TimeUnit.HOURS);//基础数据更新
        sexec.scheduleWithFixedDelay(autoExecScanThread, 180, 50, TimeUnit.SECONDS);//班次自动执行
        //DirectivePushQueue.start();//消息队列 -指令,系统下发的
        WebSocketPushQueue.start();//消息队列 -webSocket ,推送至线调web页面的

        /** 线调为其他程序提供的数据 --写入数据库 */
        sexec.scheduleWithFixedDelay(fcxxUpdateThread, 160, 30, TimeUnit.SECONDS);//发车信息(发车屏、信息发布)
        //线路首末班数据(网关用,班次更新时写入)
        //com.bsth.data.schedule.f_a_l.FirstAndLastHandler
        sexec.scheduleWithFixedDelay(schSiginUpdateDBThread, 160, 60 * 30, TimeUnit.SECONDS);//无法自动完成的班次信息(网关用,补信号)

        //运管处静态数据提交
        //log.info(timeDiff / 1000 / 60 + "分钟之后提交到运管处");
        //sexec.scheduleAtFixedRate(submitToTrafficManage, timeDiffTraffic / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
        //计算油、公里加注
        sexec.scheduleAtFixedRate(calcOilThread, timeDiff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);

        //线路版本更新
        sexec.scheduleWithFixedDelay(lineVersionsData, 60 * 5, 60 * 15, TimeUnit.SECONDS);

        //线路版本更新
        //sexec.scheduleWithFixedDelay(fixedEnableVerionsThread, 60 * 4, 60 * 2 , TimeUnit.SECONDS);
    }

    public void prodInit(){
        log.info("prodInit...");
        ScheduledExecutorService sexec = Application.mainServices;
        //安全驾驶
        sexec.scheduleWithFixedDelay(safeDrivDataLoadThread, 180, 10, TimeUnit.SECONDS);

        GpsDataLoaderThread.setFlag(-1);
        /** 线调业务 */
        sexec.scheduleWithFixedDelay(scheduleRefreshThread, 10, 120, TimeUnit.SECONDS);//班次更新线程
        sexec.scheduleWithFixedDelay(scheduleLateThread, 140, 20, TimeUnit.SECONDS);//检查班次误点
        sexec.scheduleWithFixedDelay(gpsDataLoader, 0, 2, TimeUnit.SECONDS);//抓取GPS数据
        //sexec.scheduleWithFixedDelay(rfidDataLoader, 5, 5, TimeUnit.SECONDS);//抓取RFID数据
        sexec.scheduleWithFixedDelay(fixedCheckStationCodeThread, 60, 60 * 5, TimeUnit.SECONDS);//检查班次站点编码

        sexec.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS);//GPS设备掉离线
        sexec.scheduleWithFixedDelay(schedulePstThread, 180, 10, TimeUnit.SECONDS);//班次延迟入库线程
        sexec.scheduleWithFixedDelay(seiPstThread, 180, 60, TimeUnit.SECONDS);//班次修正日志入库
        sexec.scheduleWithFixedDelay(directivesPstThread, 120, 60, TimeUnit.SECONDS);//调度指令延迟入库
        sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS);//线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作)
        sexec.scheduleWithFixedDelay(sampleTimeDataLoader, 140, 120 * 60, TimeUnit.SECONDS);//到离站预测需要的站点间耗时数据
        sexec.scheduleWithFixedDelay(basicDataLoader, 1, 1, TimeUnit.HOURS);//基础数据更新
        sexec.scheduleWithFixedDelay(autoExecScanThread, 180, 50, TimeUnit.SECONDS);//班次自动执行
        DirectivePushQueue.start();//消息队列 -指令,系统下发的
        WebSocketPushQueue.start();//消息队列 -webSocket ,推送至线调web页面的

        /** 线调为其他程序提供的数据 --写入数据库 */
        sexec.scheduleWithFixedDelay(fcxxUpdateThread, 160, 30, TimeUnit.SECONDS);//发车信息(发车屏、信息发布)
        //线路首末班数据(网关用,班次更新时写入)
        //com.bsth.data.schedule.f_a_l.FirstAndLastHandler
        sexec.scheduleWithFixedDelay(schSiginUpdateDBThread, 160, 60 * 30, TimeUnit.SECONDS);//无法自动完成的班次信息(网关用,补信号)

        //运管处静态数据提交
        log.info(timeDiff / 1000 / 60 + "分钟之后提交到运管处");
        sexec.scheduleAtFixedRate(submitToTrafficManage, timeDiffTraffic / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
        //计算油、公里加注
        sexec.scheduleAtFixedRate(calcOilThread, timeDiff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);

        //线路版本更新
        sexec.scheduleWithFixedDelay(lineVersionsData, 60 * 5, 60 * 15, TimeUnit.SECONDS);

        //线路版本更新
        //sexec.scheduleWithFixedDelay(fixedEnableVerionsThread, 60 * 4, 60 * 2 , TimeUnit.SECONDS);
    }

    public void testInit(){
        log.info("testInit...");
        ScheduledExecutorService sexec = Application.mainServices;
        //安全驾驶
        sexec.scheduleWithFixedDelay(safeDrivDataLoadThread, 180, 10, TimeUnit.SECONDS);

        GpsDataLoaderThread.setFlag(-1);
        //dayOfSchedule.dataRecovery();
        /** 线调业务 */
        sexec.scheduleWithFixedDelay(scheduleRefreshThread, 10, 120, TimeUnit.SECONDS);//班次更新线程
        sexec.scheduleWithFixedDelay(scheduleLateThread, 140, 20, TimeUnit.SECONDS);//检查班次误点
        sexec.scheduleWithFixedDelay(gpsDataLoader, 0, 2, TimeUnit.SECONDS);//抓取GPS数据
        //sexec.scheduleWithFixedDelay(rfidDataLoader, 5, 5, TimeUnit.SECONDS);//抓取RFID数据
        sexec.scheduleWithFixedDelay(fixedCheckStationCodeThread, 60, 60 * 5, TimeUnit.SECONDS);//检查班次站点编码

        sexec.scheduleWithFixedDelay(offlineMonitorThread, 120, 60, TimeUnit.SECONDS);//GPS设备掉离线
        sexec.scheduleWithFixedDelay(schedulePstThread, 180, 10, TimeUnit.SECONDS);//班次延迟入库线程
        sexec.scheduleWithFixedDelay(seiPstThread, 180, 60, TimeUnit.SECONDS);//班次修正日志入库
        sexec.scheduleWithFixedDelay(directivesPstThread, 120, 60, TimeUnit.SECONDS);//调度指令延迟入库
        sexec.scheduleWithFixedDelay(threadMonotor, 240, 60, TimeUnit.SECONDS);//线程监听(防止重要的线程阻塞、异常结束。以及部分主备切换工作)
        sexec.scheduleWithFixedDelay(sampleTimeDataLoader, 140, 120 * 60, TimeUnit.SECONDS);//到离站预测需要的站点间耗时数据
        sexec.scheduleWithFixedDelay(basicDataLoader, 1, 1, TimeUnit.HOURS);//基础数据更新
        sexec.scheduleWithFixedDelay(autoExecScanThread, 180, 50, TimeUnit.SECONDS);//班次自动执行
        //DirectivePushQueue.start();//消息队列 -指令,系统下发的
        WebSocketPushQueue.start();//消息队列 -webSocket ,推送至线调web页面的

        /** 线调为其他程序提供的数据 --写入数据库 */
        sexec.scheduleWithFixedDelay(fcxxUpdateThread, 160, 30, TimeUnit.SECONDS);//发车信息(发车屏、信息发布)
        //线路首末班数据(网关用,班次更新时写入)
        //com.bsth.data.schedule.f_a_l.FirstAndLastHandler
        sexec.scheduleWithFixedDelay(schSiginUpdateDBThread, 160, 60 * 30, TimeUnit.SECONDS);//无法自动完成的班次信息(网关用,补信号)

        //运管处静态数据提交
        //log.info(timeDiff / 1000 / 60 + "分钟之后提交到运管处");
        //sexec.scheduleAtFixedRate(submitToTrafficManage, timeDiffTraffic / 1000, 60 * 60 * 24, TimeUnit.SECONDS);
        //计算油、公里加注
        sexec.scheduleAtFixedRate(calcOilThread, timeDiff / 1000, 60 * 60 * 24, TimeUnit.SECONDS);

        //线路版本更新
        sexec.scheduleWithFixedDelay(lineVersionsData, 60 * 5, 60 * 15, TimeUnit.SECONDS);

        //线路版本更新
        //sexec.scheduleWithFixedDelay(fixedEnableVerionsThread, 60 * 4, 60 * 2 , TimeUnit.SECONDS);
    }
}