Add error handler to queued endpoints' workers
This commit is contained in:
@@ -62,6 +62,7 @@ class EndpointLoader(
|
||||
)
|
||||
|
||||
private fun createQueuedEndpoint(luaTable: LuaTable): Endpoint = QueuedEndpoint(
|
||||
context = context,
|
||||
uri = parseUri(luaTable),
|
||||
method = parseMethod(luaTable),
|
||||
accepts = parseAccepts(luaTable),
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.bartlomiejpluta.ttsserver.core.web.endpoint
|
||||
|
||||
import android.content.Context
|
||||
import com.bartlomiejpluta.ttsserver.core.web.dto.Request
|
||||
import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate
|
||||
import com.bartlomiejpluta.ttsserver.core.web.worker.Worker
|
||||
@@ -9,19 +10,14 @@ import org.luaj.vm2.LuaClosure
|
||||
import java.util.concurrent.LinkedBlockingQueue
|
||||
|
||||
class QueuedEndpoint(
|
||||
context: Context,
|
||||
uri: UriTemplate,
|
||||
accepts: String?,
|
||||
method: NanoHTTPD.Method,
|
||||
consumer: LuaClosure
|
||||
) : AbstractEndpoint(uri, accepts, method) {
|
||||
private val queue = LinkedBlockingQueue<Request>()
|
||||
private val worker = Thread(
|
||||
Worker(
|
||||
queue,
|
||||
consumer
|
||||
)
|
||||
).also { it.name = uri.template }
|
||||
|
||||
private val worker = Thread(Worker(context, queue, consumer)).also { it.name = uri.template }
|
||||
|
||||
|
||||
override fun safeHit(request: Request): NanoHTTPD.Response? {
|
||||
|
||||
@@ -1,15 +1,21 @@
|
||||
package com.bartlomiejpluta.ttsserver.core.web.worker
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import androidx.localbroadcastmanager.content.LocalBroadcastManager
|
||||
import com.bartlomiejpluta.ttsserver.core.web.dto.Request
|
||||
import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService
|
||||
import com.bartlomiejpluta.ttsserver.service.state.ServiceState
|
||||
import com.bartlomiejpluta.ttsserver.ui.main.MainActivity
|
||||
import org.luaj.vm2.LuaClosure
|
||||
import org.luaj.vm2.LuaError
|
||||
import org.luaj.vm2.LuaInteger
|
||||
import org.luaj.vm2.LuaValue
|
||||
import org.luaj.vm2.lib.ZeroArgFunction
|
||||
import java.util.concurrent.BlockingQueue
|
||||
|
||||
class Worker(
|
||||
private val context: Context,
|
||||
private val queue: BlockingQueue<Request>,
|
||||
private val consumer: LuaClosure
|
||||
) : Runnable {
|
||||
@@ -21,7 +27,19 @@ class Worker(
|
||||
Thread.currentThread().interrupt()
|
||||
}
|
||||
|
||||
private fun consume(request: Request) = consumer.call(request.luaTable, QueueSizeFunction(queue))
|
||||
private fun consume(request: Request) = try {
|
||||
consumer.call(request.luaTable, QueueSizeFunction(queue))
|
||||
} catch (e: LuaError) {
|
||||
handleLuaError(e)
|
||||
}
|
||||
|
||||
private fun handleLuaError(exception: LuaError) {
|
||||
LocalBroadcastManager
|
||||
.getInstance(context)
|
||||
.sendBroadcast(Intent(MainActivity.LUA_ERROR).also {
|
||||
it.putExtra(MainActivity.MESSAGE, exception.message)
|
||||
})
|
||||
}
|
||||
|
||||
class QueueSizeFunction(private val queue: BlockingQueue<Request>) : ZeroArgFunction() {
|
||||
override fun call(): LuaInteger = LuaValue.valueOf(queue.size)
|
||||
|
||||
Reference in New Issue
Block a user