package cn.flightfeather.supervision.datafetch
|
|
import org.springframework.stereotype.Component
|
import java.util.*
|
import java.util.concurrent.*
|
|
/**
|
* 数据获取控制器
|
*/
|
@Component
|
class FetchController(
|
fetchNightConstruction: FetchNightConstruction
|
) {
|
|
companion object {
|
private const val FETCH_PERIOD_MIN = 30L
|
private const val MAINTAIN_PERIOD_MIN = 15L
|
}
|
|
private val fetchData = mutableListOf<FetchData>()
|
private var schedule = Executors.newScheduledThreadPool(1)
|
private var maintainSchedule = Executors.newScheduledThreadPool(1)
|
private var fetchTime: Date = Date()
|
private var maintainTime: Date = Date()
|
|
init {
|
fetchData.add(fetchNightConstruction)
|
}
|
|
fun run() {
|
println("【飞羽监管】数据获取任务启动")
|
fetchTask()
|
maintainTask()
|
}
|
|
private fun fetchTask(isFirst: Boolean = false) {
|
if (!isFirst) {
|
schedule = closeThread(schedule)
|
}
|
schedule.scheduleAtFixedRate({
|
fetchTime = Date()
|
if (Date().time - maintainTime.time > (MAINTAIN_PERIOD_MIN * 2) * 60 * 1000) {
|
maintainTask()
|
}
|
fetchData.forEach {
|
it.fetch()
|
}
|
}, 0, FETCH_PERIOD_MIN, TimeUnit.MINUTES)
|
}
|
|
private fun maintainTask(isFirst: Boolean = false) {
|
if (!isFirst) {
|
maintainSchedule = closeThread(maintainSchedule)
|
}
|
maintainSchedule.scheduleAtFixedRate({
|
maintainTime = Date()
|
if (Date().time - fetchTime.time > (FETCH_PERIOD_MIN * 2) * 60 * 1000) {
|
fetchTask()
|
}
|
}, 0, MAINTAIN_PERIOD_MIN, TimeUnit.MINUTES)
|
}
|
|
private fun closeThread(s: ScheduledExecutorService): ScheduledExecutorService {
|
try {
|
s.shutdown()
|
if (s.awaitTermination(10, TimeUnit.SECONDS)) {
|
s.shutdownNow()
|
}
|
} catch (e: InterruptedException) {
|
e.printStackTrace()
|
s.shutdownNow()
|
}
|
return Executors.newScheduledThreadPool(1)
|
}
|
}
|