StartCommand.java 5.59 KB
package com.bsth;


import com.bsth.repository.schedule.CarConfigInfoRepository;
import com.bsth.security.SecurityMetadataSourceService;
import com.bsth.service.realcontrol.buffer.GetSchedulePlanThread;
import com.bsth.service.realcontrol.buffer.SchedulePersistenceThread;
import com.bsth.util.DateUtils;
import com.bsth.vehicle.common.CommonRefreshThread;
import com.bsth.vehicle.directive.buffer.DirectiveBuffer;
import com.bsth.vehicle.directive.service.DirectiveService;
import com.bsth.vehicle.directive.thread.DirectivePersistenceThread;
import com.bsth.vehicle.directive.thread.FirstScheduleIssuedThread;
import com.bsth.vehicle.gpsdata.ArrivalThread;
import com.bsth.vehicle.gpsdata.GpsOfflineMonitorThread;
import com.bsth.vehicle.gpsdata.GpsRealDataRefreshThread;

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.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 随应用启动运行
 * @author PanZhao
 *
 */
@Component
public class StartCommand implements CommandLineRunner{

	Logger logger = LoggerFactory.getLogger(this.getClass());
	
	@Autowired
	SecurityMetadataSourceService invocationSecurityMetadataSourceService;
	
	public static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(8);
	
	@Autowired
	GpsRealDataRefreshThread gpsRefreshThread;
	@Autowired
	GetSchedulePlanThread getSchedulePlanThread;
	@Autowired
	CommonRefreshThread commonRefreshThread;
	@Autowired
	DirectivePersistenceThread directivePersistenceThread;
	@Autowired
	SchedulePersistenceThread SchedulePersistenceThread;
	@Autowired
	ArrivalThread gpsArrivalStationThread;
	@Autowired
	FirstScheduleIssuedThread firstScheduleIssuedThread;
	
	@Autowired
	DirectiveService directiveService;
	@Autowired
	DirectiveBuffer directiveBuffer;
	@Autowired
	CarConfigInfoRepository carConfigInfoRepository;
	
	@Autowired
	GpsOfflineMonitorThread gpsOfflineMonitorThread;
	
	final static Long HOUR_TIME = 1000 * 60 * 60L;
	
	final static int HOUR_SECOND = 60 * 60;
	
	@Override
	public void run(String... arg0){
		
		try {
			//启动时加载所有资源
			invocationSecurityMetadataSourceService.loadResourceDefine();
			
			/**
			 * 车辆,设备,公司等常用的映射数据,每两小时刷新一次
			 */
			commonRefreshThread.start();
			scheduler.scheduleWithFixedDelay(commonRefreshThread, HOUR_SECOND * 2 , HOUR_SECOND * 2, TimeUnit.SECONDS);
			//等映射数据加载完......睡一会吧
			Thread.sleep(4000);
			
			/**
			 * GPS实时数据更新 线程
			 * 每8秒和网关HTTP接口同步一次
			 */
			scheduler.scheduleWithFixedDelay(gpsRefreshThread, 0, 8, TimeUnit.SECONDS);
			
			/**
			 * GPS 监控设备掉线行为
			 * 每分钟检测一次
			 */
			scheduler.scheduleWithFixedDelay(gpsOfflineMonitorThread, 60, 60, TimeUnit.SECONDS);
			
			
			/**
			 * 每天 凌晨 2 点 抓取当天实际排班
			 */
			//启动时先run一次
			getSchedulePlanThread.start();
			scheduler.scheduleAtFixedRate(getSchedulePlanThread
					, ((DateUtils.getTimesnight2() + HOUR_TIME * 2) - System.currentTimeMillis()) / 1000
					, 60 * 60 * 24, TimeUnit.SECONDS);
			
			/**
			 * 调度指令两分钟入库一次
			 * 指令会缓存在内存,直到收到所有响应再入库
			 */
			//从数据库恢复初始数据
			directiveBuffer.recovery();
			scheduler.scheduleWithFixedDelay(directivePersistenceThread, 20, 60 * 2, TimeUnit.SECONDS);
			
			/**
			 * 每分钟将有变更的班次入库(不包括子任务)
			 * 单纯为了提高 线调操作 的响应速度
			 */
			scheduler.scheduleWithFixedDelay(SchedulePersistenceThread, 60 * 1, 60 * 1, TimeUnit.SECONDS);
			
			/**
			 * 每15秒从数据库抓取到离站信息和班次匹配
			 * (网关生成的到离站数据也是延迟批量入库,所以缩短该线程执行周期并不会提高 “实际到离站” 的实时性)
			 */
			scheduler.scheduleWithFixedDelay(gpsArrivalStationThread, 35, 15, TimeUnit.SECONDS);
			
			/**
			 * 首个调度指令下发(2分钟运行一次)
			 * 每辆车的第一个调度指令由该线程下发
			 * 后续班次由 “实际终点到达” 事件触发指令下发
			 */
			scheduler.scheduleWithFixedDelay(firstScheduleIssuedThread, 60 , 60 * 2, TimeUnit.SECONDS);
			
			
/*			new Timer().schedule(new TimerTask() {
				
				@Override
				public void run() {
					List<CarConfigInfo> ccis = carConfigInfoRepository.findAll();
					Cars car;
					Line line;
					String lineCode;
					System.out.println("ccis size: " + ccis.size());
					for(CarConfigInfo cci : ccis){
						car = cci.getCl();
						line = cci.getXl();
						lineCode = line.getLineCode();
						
						String data = directiveService.createDeviceRefreshData(CommonMapped.vehicDeviceBiMap.inverse().get(car.getInsideCode())
								, Integer.parseInt(lineCode));
						System.out.println(data);
						int code = HttpUtils.postJson(data);
						System.out.println("车辆:" + car.getInsideCode() + "刷新线路:" + line.getLineCode());
						code = directiveService.lineChange(car.getInsideCode(), Integer.parseInt(lineCode));
						//directiveService.send60Phrase(car.getInsideCode(), "");
						System.out.println("返回值:" + code);
					}
					
				}
			}, 1000 * 10);*/
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}