| | |
| | | package cn.flightfeather.supervision.common.executor |
| | | |
| | | import cn.flightfeather.supervision.common.exception.BizException |
| | | import cn.flightfeather.supervision.socket.WebSocketSendMessageUtil |
| | | import org.springframework.stereotype.Component |
| | | import java.time.LocalDateTime |
| | | import java.util.concurrent.ConcurrentHashMap |
| | | import java.util.concurrent.Executors |
| | | import kotlin.jvm.Throws |
| | |
| | | /** |
| | | * 新增任务 |
| | | */ |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun newTask(type: BgTaskType, id: String, name: String, task: () -> Boolean): BgTask { |
| | | if (!taskCollection.containsKey(type)) { |
| | | taskCollection[type] = ConcurrentHashMap<String, BgTask>() |
| | | } |
| | | val taskSet = taskCollection[type]!! |
| | | if (taskSet.containsKey(id)) throw IllegalStateException("无法创建任务, 任务[${name}]的id重复") |
| | | val t = BgTask(type, id, name, task) |
| | | // 判断任务id是否存在 |
| | | if (taskSet.containsKey(id)) { |
| | | val oldTask = taskSet[id] |
| | | // 当任务已经结束时,直接删除,替换为新任务 |
| | | if (oldTask?.taskStatus?.status != TaskStatus.WAITING || oldTask.taskStatus.status != TaskStatus.RUNNING) { |
| | | taskSet.remove(id) |
| | | } |
| | | else { |
| | | throw BizException("无法重复创建任务") |
| | | } |
| | | } |
| | | val t = BgTask(type, id, name, task) { status -> |
| | | // 发送消息 |
| | | WebSocketSendMessageUtil.sendBgTaskMessage(status) |
| | | } |
| | | taskSet[id] = t |
| | | return t |
| | | } |
| | |
| | | /** |
| | | * 开始任务 |
| | | */ |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun startTask(type: BgTaskType, id: String): BgTask { |
| | | val taskSet = taskCollection[type] ?: throw throw IllegalStateException("无法开启任务,该任务类型[${type.des}]不存在") |
| | | val t = taskSet[id] ?: throw IllegalStateException("无法开启任务,该任务[${id}]不存在") |
| | | val taskSet = taskCollection[type] ?: throw throw BizException("无法开启任务,该任务类型[${type.des}]不存在") |
| | | val t = taskSet[id] ?: throw BizException("无法开启任务,该任务[${id}]不存在") |
| | | return startTask(t) |
| | | } |
| | | |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun startTask(task: BgTask): BgTask { |
| | | if (task.taskStatus.status != TaskStatus.WAITING) { |
| | | if (task.taskStatus.status == TaskStatus.RUNNING) { |
| | | throw IllegalStateException("无法开启任务,任务[${task.name}]正在执行") |
| | | throw BizException("无法开启任务,任务[${task.name}]正在执行") |
| | | } else { |
| | | throw IllegalStateException("无法开启任务,任务[${task.name}]已结束") |
| | | throw BizException("无法开启任务,任务[${task.name}]已结束") |
| | | } |
| | | } else { |
| | | task.ready() |
| | | task.future = executorService.submit { task.execute() } |
| | | task.future = executorService.submit { |
| | | task.execute() |
| | | } |
| | | return task |
| | | } |
| | | } |
| | |
| | | /** |
| | | * 新增并开始任务 |
| | | */ |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun startNewTask(type: BgTaskType, id: String, name: String, task: () -> Boolean): BgTask { |
| | | val t = newTask(type, id, name, task) |
| | | return startTask(t) |
| | |
| | | /** |
| | | * 强制关闭任务 |
| | | */ |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun shutDownTask(type: BgTaskType, id: String?): List<BgTaskStatus?> { |
| | | val taskMap = taskCollection[type] ?: throw IllegalStateException("无法关闭任务,任务类型[${type.des}]未创建") |
| | | val taskMap = taskCollection[type] ?: throw BizException("无法关闭任务,任务类型[${type.des}]未创建") |
| | | return if (id != null) { |
| | | val task = taskMap[id] ?: throw IllegalStateException("无法关闭任务,任务[${id}]不存在") |
| | | val task = taskMap[id] ?: throw BizException("无法关闭任务,任务[${id}]不存在") |
| | | task.shutdown() |
| | | listOf(task.taskStatus) |
| | | } else { |
| | |
| | | } |
| | | } |
| | | |
| | | @Throws(IllegalStateException::class) |
| | | @Throws(BizException::class) |
| | | fun removeTask(type: BgTaskType, id: String): Boolean { |
| | | val statusList = shutDownTask(type, id) |
| | | if (statusList.isNotEmpty()) { |
| | | val s = statusList.first() ?: throw IllegalStateException("无法移除任务,任务不存在") |
| | | val s = statusList.first() ?: throw BizException("无法移除任务,任务不存在") |
| | | taskCollection[s.type]?.remove(s.id) |
| | | return true |
| | | } |