From ad9281b609bf1bed0fef52d4e1ba9b65a5ad7efd Mon Sep 17 00:00:00 2001 From: stephen Date: Fri, 20 Oct 2023 16:34:09 -0400 Subject: [PATCH] graceful shutdown --- src/main/kotlin/net/eksb/obsdc/DBus.kt | 11 +++++--- src/main/kotlin/net/eksb/obsdc/Handler.kt | 5 ---- src/main/kotlin/net/eksb/obsdc/Main.kt | 2 +- .../eksb/obsdc/{ObsCommunity.kt => Obs.kt} | 27 +++++++++++++++---- 4 files changed, 31 insertions(+), 14 deletions(-) delete mode 100644 src/main/kotlin/net/eksb/obsdc/Handler.kt rename src/main/kotlin/net/eksb/obsdc/{ObsCommunity.kt => Obs.kt} (87%) diff --git a/src/main/kotlin/net/eksb/obsdc/DBus.kt b/src/main/kotlin/net/eksb/obsdc/DBus.kt index bb77b9e..2efb49f 100644 --- a/src/main/kotlin/net/eksb/obsdc/DBus.kt +++ b/src/main/kotlin/net/eksb/obsdc/DBus.kt @@ -7,10 +7,11 @@ import org.freedesktop.dbus.interfaces.DBusInterface import org.freedesktop.dbus.interfaces.DBusSigHandler import org.freedesktop.dbus.messages.DBusSignal import org.slf4j.LoggerFactory -import java.util.Queue +import java.util.concurrent.BlockingQueue +import java.util.concurrent.TimeUnit import kotlin.concurrent.thread -class DBus(private val q: Queue) { +class DBus(private val q: BlockingQueue) { private val thread = thread( start = true, @@ -27,7 +28,11 @@ class DBus(private val q: Queue) { log.info("signal: ${signal.op}") val op = Op.valueOf(signal.op) log.info("op: ${op}") - q.offer(op) + try { + q.offer(op, 1, TimeUnit.SECONDS) + } catch (e:InterruptedException) { + log.debug("queue offer interrupted") + } } while (true) { try { diff --git a/src/main/kotlin/net/eksb/obsdc/Handler.kt b/src/main/kotlin/net/eksb/obsdc/Handler.kt deleted file mode 100644 index aed49cd..0000000 --- a/src/main/kotlin/net/eksb/obsdc/Handler.kt +++ /dev/null @@ -1,5 +0,0 @@ -package net.eksb.obsdc - -fun interface Handler { - fun handle(op:Op) -} \ No newline at end of file diff --git a/src/main/kotlin/net/eksb/obsdc/Main.kt b/src/main/kotlin/net/eksb/obsdc/Main.kt index e0cd3ea..39eb058 100644 --- a/src/main/kotlin/net/eksb/obsdc/Main.kt +++ b/src/main/kotlin/net/eksb/obsdc/Main.kt @@ -8,6 +8,6 @@ object Main { fun main(args: Array) { val q:BlockingQueue = LinkedBlockingQueue() DBus(q) // forks daemon thread - ObsCommunity(q).run() // blocks + Obs(q).run() // blocks } } \ No newline at end of file diff --git a/src/main/kotlin/net/eksb/obsdc/ObsCommunity.kt b/src/main/kotlin/net/eksb/obsdc/Obs.kt similarity index 87% rename from src/main/kotlin/net/eksb/obsdc/ObsCommunity.kt rename to src/main/kotlin/net/eksb/obsdc/Obs.kt index 460b852..d1d0a7f 100644 --- a/src/main/kotlin/net/eksb/obsdc/ObsCommunity.kt +++ b/src/main/kotlin/net/eksb/obsdc/Obs.kt @@ -7,9 +7,11 @@ import io.obswebsocket.community.client.model.SceneItem.Transform import io.obswebsocket.community.client.model.SceneItem.Transform.TransformBuilder import org.slf4j.LoggerFactory import java.util.concurrent.BlockingQueue +import java.util.concurrent.TimeUnit +import kotlin.concurrent.thread // protocol docs: https://github.com/obsproject/obs-websocket/blob/master/docs/generated/protocol.md -class ObsCommunity(private val q:BlockingQueue): AutoCloseable { +class Obs(private val q:BlockingQueue): AutoCloseable { private val panAmount = 50F @@ -31,6 +33,16 @@ class ObsCommunity(private val q:BlockingQueue): AutoCloseable { } .build() + private var alive = true + + init { + Runtime.getRuntime().addShutdownHook(thread(start=false) { + log.info("shutdown") + alive = false + controller.stop() + }) + } + fun run() { controller.connect() } @@ -41,9 +53,14 @@ class ObsCommunity(private val q:BlockingQueue): AutoCloseable { private fun ready() { log.info("ready") - val op: Op = q.take() // blocks - log.info("op: ${op}") - op(op) + while(alive) { + val op: Op? = q.poll(1, TimeUnit.SECONDS) // blocks + if (op != null) { + log.info("op: ${op}") + op(op) + break + } + } } private fun op(op:Op) { @@ -107,6 +124,6 @@ class ObsCommunity(private val q:BlockingQueue): AutoCloseable { } companion object { - private val log = LoggerFactory.getLogger(ObsCommunity::class.java) + private val log = LoggerFactory.getLogger(Obs::class.java) } }