package cn.flightfeather.supervision.bgtask
|
|
import org.slf4j.LoggerFactory
|
import org.springframework.beans.factory.annotation.Value
|
import org.springframework.stereotype.Component
|
import java.time.LocalDateTime
|
import java.time.LocalTime
|
import java.util.*
|
import java.util.concurrent.Executors
|
import java.util.concurrent.ScheduledExecutorService
|
import java.util.concurrent.TimeUnit
|
|
/**
|
* 数据获取控制器
|
*/
|
@Component
|
class TaskController(
|
fetchVOC: TaskFetchVOC,
|
pushFume: TaskPushFume,
|
ledgerCopy: TaskLedgerCopy,
|
ledgerRemind: TaskLedgerRemind,
|
taskJinAnLampEnterBaseInfo: TaskJinAnLampEnterBaseInfo,
|
taskJinAnLampDeviceData: TaskJinAnLampDeviceData,
|
taskJinAnConstructionSiteInfo: TaskJinAnConstructionSiteInfo,
|
taskJinAnHourlyDustData: TaskJinAnHourlyDustData,
|
taskAutoLedger:TaskAutoLedger,
|
// 根据app不同,切换不同的定时任务
|
@Value("\${mode}") mode: String,
|
) {
|
|
companion object {
|
private const val FETCH_PERIOD_MIN = 1L * 60
|
private const val MAINTAIN_PERIOD_MIN = 5L * 60
|
val LOGGER = LoggerFactory.getLogger(TaskController::class.java)
|
}
|
|
private val timeTask = mutableListOf<BaseTimingTask>()
|
private var schedule = Executors.newScheduledThreadPool(1)
|
private var maintainSchedule = Executors.newScheduledThreadPool(1)
|
private var taskTime: Date = Date()
|
private var maintainTime: Date = Date()
|
|
init {
|
LOGGER.info("添加定时任务")
|
timeTask.clear()
|
//飞羽环境,获取voc数据、推送油烟数据
|
if (mode == "proapp") {
|
timeTask.add(fetchVOC)
|
timeTask.add(pushFume)
|
} else if (mode == "pro") {
|
//微信小程序(中小企业守法自助),台账复制、定时任务推送等
|
// timeTask.add(ledgerCopy)
|
timeTask.add(ledgerRemind)
|
timeTask.add(taskJinAnLampEnterBaseInfo)
|
// timeTask.add(taskJinAnLampDeviceData)
|
timeTask.add(taskJinAnConstructionSiteInfo)
|
// timeTask.add(taskJinAnHourlyDustData)
|
timeTask.add(taskAutoLedger)
|
}
|
LOGGER.info("添加定时任务完成,任务总计${timeTask.size}个")
|
}
|
|
fun run() {
|
fetchTask(true)
|
maintainTask(true)
|
}
|
|
private fun fetchTask(isFirst: Boolean = false) {
|
val cal = Calendar.getInstance()
|
val time = LocalTime.now()
|
val sec = time.second
|
val delay = 60L - sec
|
// var localtime = LocalDateTime.of(2021, 4, 16, 9, 0)
|
if (!isFirst) {
|
schedule = closeThread(schedule)
|
}
|
schedule.scheduleAtFixedRate({
|
taskTime = Date()
|
if (Date().time - maintainTime.time > (MAINTAIN_PERIOD_MIN + 1) * 60 * 1000) {
|
maintainTask()
|
}
|
|
val localtime = LocalDateTime.now()
|
// LOGGER.info("定时任务执行,定时任务数:${timeTask.size}")
|
timeTask.forEach {
|
// LOGGER.info("定时任务:${it.javaClass.name}")
|
it.execute(localtime)
|
}
|
// localtime = localtime.plusMinutes(1)
|
}, delay, FETCH_PERIOD_MIN, TimeUnit.SECONDS)
|
}
|
|
private fun maintainTask(isFirst: Boolean = false) {
|
if (!isFirst) {
|
maintainSchedule = closeThread(maintainSchedule)
|
}
|
maintainSchedule.scheduleAtFixedRate({
|
maintainTime = Date()
|
if (Date().time - taskTime.time > (FETCH_PERIOD_MIN + 1) * 60 * 1000) {
|
fetchTask()
|
}
|
}, 0, MAINTAIN_PERIOD_MIN, TimeUnit.SECONDS)
|
}
|
|
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)
|
}
|
}
|