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(
|
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),
|
||||||
|
|||||||
@@ -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? {
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user