Add error handler to queued endpoints' workers

This commit is contained in:
2020-07-06 17:07:28 +02:00
parent 8d307e3e87
commit bd0f319f6a
3 changed files with 23 additions and 8 deletions

View File

@@ -62,6 +62,7 @@ class EndpointLoader(
)
private fun createQueuedEndpoint(luaTable: LuaTable): Endpoint = QueuedEndpoint(
context = context,
uri = parseUri(luaTable),
method = parseMethod(luaTable),
accepts = parseAccepts(luaTable),

View File

@@ -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? {

View File

@@ -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)