Я пытаюсь понять сопрограммы на Kotlin, и у меня есть несколько вопросов по этой теме.
Эти задания создаются из цикла foreach внутри ScheduledService, который извлекает задачи, и каждая задача запускает задание сопрограммы таким образом
fun executeUploadJob(transporter: Transporter, taskId: Long) {
GlobalScope.launch {
exportTaskRepository.findById(taskId).ifPresent { task ->
task.status = TaskStatus.IN_PROGRESS
exportTaskRepository.save(task)
}
transporter.executeSingleFilesTransportCycle()
}.invokeOnCompletion {
when (it) {
null -> {
exportTaskRepository.findById(taskId).ifPresent { task ->
task.status = TaskStatus.UPLOADED
task.lastUpdated = Timestamp(System.currentTimeMillis())
exportTaskRepository.save(task)
}
}
//means that job was cancelled from outside and it should not be counted as error
is CancellationException -> {
logger.warn("Job was cancelled..[Task Id - $taskId]", it)
exportTaskRepository.findById(taskId).ifPresent { task ->
task.lastUpdated = Timestamp(System.currentTimeMillis())
task.nextAttempt = Timestamp(System.currentTimeMillis() + THIRTY_MINUTES)
task.status = TaskStatus.WAITING
exportTaskRepository.save(task)
}
}
else -> {
logger.error("Error while uploading file [TaskId - $taskId]", it)
exportTaskRepository.findById(taskId).ifPresent { task ->
task.lastUpdated = Timestamp(System.currentTimeMillis())
task.nextAttempt = Timestamp(System.currentTimeMillis() + THIRTY_MINUTES)
task.status = TaskStatus.WAITING
exportTaskRepository.save(task)
}
}
}
}
}
Мой вопрос: 1) Если возникнут какие-либо исключения, будет ли текущая сопрограмма существовать в JVM, или она исчезнет, и не будет утечек памяти, а также ссылок на Job?
2) Правильно ли сохранять где-либо ссылки на задания, чтобы периодически отслеживать их состояние?