mirror of
https://gitlab.com/mangadex-pub/mangadex_at_home.git
synced 2024-01-19 02:48:37 +00:00
Third try at concurrency
This commit is contained in:
parent
89d9a9386f
commit
c64ae4e339
|
@ -28,7 +28,9 @@ import com.fasterxml.jackson.module.kotlin.readValue
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileReader
|
import java.io.FileReader
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
|
import java.util.concurrent.CountDownLatch
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
import java.util.concurrent.ScheduledFuture
|
||||||
import java.util.concurrent.TimeUnit
|
import java.util.concurrent.TimeUnit
|
||||||
import java.util.regex.Pattern
|
import java.util.regex.Pattern
|
||||||
import mdnet.base.Main.dieWithError
|
import mdnet.base.Main.dieWithError
|
||||||
|
@ -46,6 +48,7 @@ class ClientSettingsException(message: String) : Exception(message)
|
||||||
class MangaDexClient(private val settingsFile: File, databaseFile: File, cacheFolder: File) {
|
class MangaDexClient(private val settingsFile: File, databaseFile: File, cacheFolder: File) {
|
||||||
// this must remain single-threaded because of how the state mechanism works
|
// this must remain single-threaded because of how the state mechanism works
|
||||||
private val executor = Executors.newSingleThreadScheduledExecutor()
|
private val executor = Executors.newSingleThreadScheduledExecutor()
|
||||||
|
private lateinit var scheduledFuture: ScheduledFuture<*>
|
||||||
|
|
||||||
private val database: Database
|
private val database: Database
|
||||||
private val cache: DiskLruCache
|
private val cache: DiskLruCache
|
||||||
|
@ -89,7 +92,7 @@ class MangaDexClient(private val settingsFile: File, databaseFile: File, cacheFo
|
||||||
fun runLoop() {
|
fun runLoop() {
|
||||||
LOGGER.info { "Mangadex@Home Client initialized - starting normal operation." }
|
LOGGER.info { "Mangadex@Home Client initialized - starting normal operation." }
|
||||||
|
|
||||||
executor.scheduleWithFixedDelay({
|
scheduledFuture = executor.scheduleWithFixedDelay({
|
||||||
try {
|
try {
|
||||||
// this blocks the executor, so no worries about concurrency
|
// this blocks the executor, so no worries about concurrency
|
||||||
reloadClientSettings()
|
reloadClientSettings()
|
||||||
|
@ -145,22 +148,31 @@ class MangaDexClient(private val settingsFile: File, databaseFile: File, cacheFo
|
||||||
}
|
}
|
||||||
|
|
||||||
fun shutdown() {
|
fun shutdown() {
|
||||||
executor.schedule({
|
|
||||||
LOGGER.info { "Mangadex@Home Client shutting down" }
|
LOGGER.info { "Mangadex@Home Client shutting down" }
|
||||||
|
val latch = CountDownLatch(1)
|
||||||
|
|
||||||
|
scheduledFuture.cancel(false)
|
||||||
|
|
||||||
|
executor.schedule({
|
||||||
if (webUi != null) {
|
if (webUi != null) {
|
||||||
stopWebUi()
|
stopWebUi()
|
||||||
}
|
}
|
||||||
if (imageServer != null) {
|
if (imageServer != null) {
|
||||||
stopImageServer()
|
stopImageServer()
|
||||||
}
|
}
|
||||||
LOGGER.info { "Mangadex@Home Client has shut down" }
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
cache.close()
|
cache.close()
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
LOGGER.error(e) { "Cache failed to close" }
|
LOGGER.error(e) { "Cache failed to close" }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
latch.countDown()
|
||||||
}, 0, TimeUnit.SECONDS)
|
}, 0, TimeUnit.SECONDS)
|
||||||
|
|
||||||
|
latch.await()
|
||||||
|
executor.shutdown()
|
||||||
|
LOGGER.info { "Mangadex@Home Client has shut down" }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in a new issue