hcong
2024-12-10 82baf5d28ce79aa4d3b64956207d247596726924
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
package cn.flightfeather.supervision.common.executor
 
import java.time.LocalDateTime
import java.util.concurrent.Future
 
/**
 * 后台任务
 */
class BgTask(
    val type: BgTaskType,
    val id: String,
    val name: String,
    private val task: () -> Boolean,
    private val onStatusChange: (status: BgTaskStatus) -> Unit
) {
    var taskStatus = BgTaskStatus(type, id, name)
    var future: Future<*>? = null
 
    fun ready() {
        taskStatus.startTime = LocalDateTime.now()
        setStatus(TaskStatus.RUNNING)
    }
 
    fun execute() {
        try {
            val res = task()
            if (res) success() else fail()
        } catch (e: Exception) {
            fail()
            taskStatus.extra = e.message
        }
    }
 
    fun success() {
        complete()
        setStatus(TaskStatus.SUCCESS)
    }
 
    fun fail() {
        complete()
        setStatus(TaskStatus.FAIL)
    }
 
    fun shutdown() {
        if (future?.isCancelled == false && !future!!.isDone) {
            future!!.cancel(true)
        }
        complete()
        setStatus(TaskStatus.SHUTDOWN)
    }
 
    fun complete() {
        taskStatus.endTime = LocalDateTime.now()
    }
 
    fun setStatus(status: TaskStatus) {
        taskStatus.status = status
        onStatusChange(taskStatus)
    }
}