Search code examples
kotlinexceptionignite

How to get original service's exception on Apache Ignite client?


Ley's say we have a service:

interface ExceptionService : Service {
    fun doSmth(flag: Boolean)
}

implementation:

class ExceptionServiceImpl : ExceptionService {
    override fun doSmth(flag: Boolean) {
        if (flag) {
            throw IOException("my IO exception")
        } else {
            throw IllegalArgumentException("my IllegalArgument exception")
        }
    }
}

We deploy it onto Ignite cluster:

Ignition.start(
    IgniteConfiguration()
        .setServiceConfiguration(
            ServiceConfiguration()
                .setService(ExceptionServiceImpl())
                .setName("service")
        )
)

And now we call it from client:

val client = Ignition.startClient(ClientConfiguration().setAddresses("127.0.0.1"))
val service = client.services().serviceProxy("service", ExceptionService::class.java)
try {
    service.doSmth(true)
} catch (e: Exception) {
    println(e.mesaage)
}
try {
    service.doSmth(false)
} catch (e: Exception) {
    println(e.mesaage)
}

Console output will be:

Ignite failed to process request [1] my IO exception (server status code [1])
Ignite failed to process request [2] my IllegalArgument exception (server status code [1])

The problem is that the type of the caught exception is always org.apache.ignite.client.ClientException. The only thing that left from the original exceptions thrown on server is message, and even it is wrapped in other words. The cause is of type org.apache.ignite.internal.client.thin.ClientServerError. Types are lost. I want to handle on client side different types of exceptions thrown by service. Is there a way to do it? Maybe some Ignite configuration that I missed?


Solution

  • Try enabling ThinClientConfiguration#sendServerExceptionStackTraceToClient