Skip to content

Commit

Permalink
refactor: Add runner for running long jobs
Browse files Browse the repository at this point in the history
  • Loading branch information
1grzyb1 committed Apr 8, 2024
1 parent 20076fa commit 46578ce
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 71 deletions.
37 changes: 37 additions & 0 deletions src/main/kotlin/odyseja/odysejapka/async/ProcessRunner.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package odyseja.odysejapka.async

import odyseja.odysejapka.Progress
import odyseja.odysejapka.Status

class ProcessRunner(private val runner: Runner) {

private var job: Thread? = null

fun start() {
if (job?.isAlive == true) {
throw RuntimeException("Runner is already working")
}
job = Thread {
runner.run()
}
job?.start()
}

fun stop() {
job?.stop()
}

fun getProgress(): Progress {

if (job?.isAlive == false) {
return Progress(0, Status.STOPPED)
}

val progress = runner.getProgress()
return if (progress != 100) {
Progress(progress, Status.RUNNING)
} else {
Progress(100, Status.STOPPED)
}
}
}
8 changes: 8 additions & 0 deletions src/main/kotlin/odyseja/odysejapka/async/Runner.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package odyseja.odysejapka.async

interface Runner {

fun run()

fun getProgress(): Int
}
19 changes: 9 additions & 10 deletions src/main/kotlin/odyseja/odysejapka/drive/ZspSheetsAdapter.kt
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,14 @@ class ZspSheetsAdapter(
return service.spreadsheets().get(zspId).execute().sheets
}

fun getNumericalValue(row: List<Any>, size: Int): Float{
fun getNumericalValue(row: List<Any>, size: Int): Float {
try {
if (row.size-1 > size-1){
if (row.size - 1 > size - 1) {
val value = row[size].toString().replace(',', '.').toFloat()
return value
}

}
catch (e: Exception) {
} catch (e: Exception) {
println("Could not convert ${row[size]}")
}
return 0f
Expand Down Expand Up @@ -97,16 +96,16 @@ class ZspSheetsAdapter(
league = row[4].toString(),
part = row[5].toString(),
teamName = row[6].toString(),
shortTeamName = row[7].toString(),
city = row[8].toString(),
shortTeamName = row[7].toString(),
city = row[8].toString(),
zspRow = i + 1,
day=day,
stage=stage,
zspSheet =sheetName,
day = day,
stage = stage,
zspSheet = sheetName,
longTermScore = getNumericalValue(row, 10),
styleScore = getNumericalValue(row, 11),
penaltyScore = getNumericalValue(row, 12),
weightHeld = getNumericalValue(row, 13),
weightHeld = getNumericalValue(row, 13),
spontaneousScore = getNumericalValue(row, 14),
)
)
Expand Down
10 changes: 6 additions & 4 deletions src/main/kotlin/odyseja/odysejapka/gad/GadRunner.kt
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import com.google.api.services.drive.model.File
import com.google.api.services.sheets.v4.model.Sheet
import odyseja.odysejapka.async.Runner
import odyseja.odysejapka.drive.DriveAdapter
import odyseja.odysejapka.drive.ZspSheetsAdapter
import java.util.concurrent.atomic.AtomicInteger
Expand All @@ -9,22 +10,23 @@ internal class GadRunner(
private val sheetsAdapter: ZspSheetsAdapter,
private val problemPunctuationCells: Map<String, PunctationCells>,
private val destinationFolderId: String
) {
) : Runner {

private val templates = getTemplates()
private var totalSheetCount = 0
private var totalSheetCount = 1
private var processedSheetCount = AtomicInteger(0)

fun createForms() {
override fun run() {
val sheets = sheetsAdapter.getSheets()
totalSheetCount = sheets?.size ?: 1
for (sheet in sheets!!) {
processSheet(sheet)
processedSheetCount.incrementAndGet()
}
processedSheetCount.set(totalSheetCount)
}

fun getProgress(): Int {
override fun getProgress(): Int {
return (processedSheetCount.get() * 100) / totalSheetCount
}

Expand Down
41 changes: 13 additions & 28 deletions src/main/kotlin/odyseja/odysejapka/gad/GadService.kt
Original file line number Diff line number Diff line change
@@ -1,51 +1,36 @@
package odyseja.odysejapka.gad

import GadConfiguration
import GadRunner
import odyseja.odysejapka.Progress
import odyseja.odysejapka.Status
import odyseja.odysejapka.async.ProcessRunner
import org.springframework.stereotype.Service

@Service
class GadService(
private val gadCommandService: GadCommandService
) {

private var gad: GadRunner? = null
private var job: Thread? = null
private var runner: ProcessRunner? = null

fun runGad(generateGadCommand: GenerateGadCommand) {
gadCommandService.saveCommand(generateGadCommand)
start(generateGadCommand)
runner = ProcessRunner(
GadConfiguration(
generateGadCommand.templatesFolderId,
generateGadCommand.destinationFolderId,
generateGadCommand.zspId,
generateGadCommand.problemPunctuationCells
).gadRunner()
)
runner?.start()
}

fun stop() {
job?.stop()
gad = null
}

private fun start(generateGadCommand: GenerateGadCommand) {
if (gad != null || job?.isAlive == true) {
throw RuntimeException("Gad is already running")
}
gad = GadConfiguration(
generateGadCommand.templatesFolderId,
generateGadCommand.destinationFolderId,
generateGadCommand.zspId,
generateGadCommand.problemPunctuationCells
).gadRunner()
job = Thread {
gad?.createForms()
}
job?.start()
runner?.stop()
}

fun getProgress(): Progress {
val progress = gad?.getProgress() ?: 100
return if (progress != 100) {
Progress(progress, Status.RUNNING)
} else {
Progress(100, Status.STOPPED)
}
return runner?.getProgress() ?: Progress(0, Status.STOPPED)
}
}
8 changes: 5 additions & 3 deletions src/main/kotlin/odyseja/odysejapka/sak/SakRunner.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package odyseja.odysejapka.sak

import com.google.api.services.drive.model.File
import odyseja.odysejapka.async.Runner
import odyseja.odysejapka.drive.DriveAdapter
import odyseja.odysejapka.drive.SheetAdapter
import odyseja.odysejapka.drive.SpontanGroups
Expand All @@ -13,13 +14,14 @@ internal class SakRunner(
private val sheetsAdapter: SheetAdapter,
private val timetableService: TimeTableService,
private val zspId: String
) {
) : Runner {

private val templates = getTemplates()
private var totalTeamsCount = 0
private var processedTeamsCount = AtomicInteger(0)

fun startSak() {

override fun run() {
val teams = timetableService.getAll()
totalTeamsCount = teams.size
val groups = teams.groupBy { SpontanGroups.Group.fromPerformance(it) }.map { (group, performances) ->
Expand Down Expand Up @@ -79,7 +81,7 @@ internal class SakRunner(
processedTeamsCount.incrementAndGet()
}

fun getProgress(): Int {
override fun getProgress(): Int {
if (totalTeamsCount != 0) {
return (processedTeamsCount.get() * 100) / totalTeamsCount
}
Expand Down
38 changes: 12 additions & 26 deletions src/main/kotlin/odyseja/odysejapka/sak/SakService.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package odyseja.odysejapka.sak
import SakConfiguration
import odyseja.odysejapka.Progress
import odyseja.odysejapka.Status
import odyseja.odysejapka.async.ProcessRunner
import odyseja.odysejapka.timetable.TimeTableService
import org.springframework.stereotype.Service

Expand All @@ -11,39 +12,24 @@ class SakService(
private val timetableService: TimeTableService
) {

private var sak: SakRunner? = null
private var job: Thread? = null
private var runner: ProcessRunner? = null

fun runGad(generateSakCommand: GenerateSakCommand) {
start(generateSakCommand)
runner = ProcessRunner(
SakConfiguration(
generateSakCommand.templatesFolderId,
timetableService,
generateSakCommand.zspId
).sakRunner()
)
runner?.start()
}

fun stop() {
job?.stop()
sak = null
}

private fun start(generateSakCommand: GenerateSakCommand) {
if (sak != null || job?.isAlive == true) {
throw RuntimeException("Gad is already running")
}
sak = SakConfiguration(
generateSakCommand.templatesFolderId,
timetableService,
generateSakCommand.zspId
).sakRunner()
job = Thread {
sak?.startSak()
}
job?.start()
runner?.stop()
}

fun getProgress(): Progress {
val progress = sak?.getProgress() ?: 100
return if (progress != 100) {
Progress(progress, Status.RUNNING)
} else {
Progress(100, Status.STOPPED)
}
return runner?.getProgress() ?: Progress(0, Status.STOPPED)
}
}

0 comments on commit 46578ce

Please sign in to comment.