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( private fun createQueuedEndpoint(luaTable: LuaTable): Endpoint = QueuedEndpoint(
context = context,
uri = parseUri(luaTable), uri = parseUri(luaTable),
method = parseMethod(luaTable), method = parseMethod(luaTable),
accepts = parseAccepts(luaTable), accepts = parseAccepts(luaTable),

View File

@@ -1,5 +1,6 @@
package com.bartlomiejpluta.ttsserver.core.web.endpoint 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.dto.Request
import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate import com.bartlomiejpluta.ttsserver.core.web.uri.UriTemplate
import com.bartlomiejpluta.ttsserver.core.web.worker.Worker import com.bartlomiejpluta.ttsserver.core.web.worker.Worker
@@ -9,19 +10,14 @@ import org.luaj.vm2.LuaClosure
import java.util.concurrent.LinkedBlockingQueue import java.util.concurrent.LinkedBlockingQueue
class QueuedEndpoint( class QueuedEndpoint(
context: Context,
uri: UriTemplate, uri: UriTemplate,
accepts: String?, accepts: String?,
method: NanoHTTPD.Method, method: NanoHTTPD.Method,
consumer: LuaClosure consumer: LuaClosure
) : AbstractEndpoint(uri, accepts, method) { ) : AbstractEndpoint(uri, accepts, method) {
private val queue = LinkedBlockingQueue<Request>() private val queue = LinkedBlockingQueue<Request>()
private val worker = Thread( private val worker = Thread(Worker(context, queue, consumer)).also { it.name = uri.template }
Worker(
queue,
consumer
)
).also { it.name = uri.template }
override fun safeHit(request: Request): NanoHTTPD.Response? { override fun safeHit(request: Request): NanoHTTPD.Response? {

View File

@@ -1,15 +1,21 @@
package com.bartlomiejpluta.ttsserver.core.web.worker 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.core.web.dto.Request
import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService import com.bartlomiejpluta.ttsserver.service.foreground.ForegroundService
import com.bartlomiejpluta.ttsserver.service.state.ServiceState import com.bartlomiejpluta.ttsserver.service.state.ServiceState
import com.bartlomiejpluta.ttsserver.ui.main.MainActivity
import org.luaj.vm2.LuaClosure import org.luaj.vm2.LuaClosure
import org.luaj.vm2.LuaError
import org.luaj.vm2.LuaInteger import org.luaj.vm2.LuaInteger
import org.luaj.vm2.LuaValue import org.luaj.vm2.LuaValue
import org.luaj.vm2.lib.ZeroArgFunction import org.luaj.vm2.lib.ZeroArgFunction
import java.util.concurrent.BlockingQueue import java.util.concurrent.BlockingQueue
class Worker( class Worker(
private val context: Context,
private val queue: BlockingQueue<Request>, private val queue: BlockingQueue<Request>,
private val consumer: LuaClosure private val consumer: LuaClosure
) : Runnable { ) : Runnable {
@@ -21,7 +27,19 @@ class Worker(
Thread.currentThread().interrupt() 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() { class QueueSizeFunction(private val queue: BlockingQueue<Request>) : ZeroArgFunction() {
override fun call(): LuaInteger = LuaValue.valueOf(queue.size) override fun call(): LuaInteger = LuaValue.valueOf(queue.size)