StartCommand.java
5.35 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
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(3000);
/**
* 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;
int code;
for(CarConfigInfo cci : ccis){
car = cci.getCl();
line = cci.getXl();
lineCode = line.getLineCode();
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();
}
}
}