jooq执行侦听器未捕获异常

ve7v8dk2  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(355)

我正在尝试实现一个优化锁定的通用解决方案。我想要实现的是在记录的版本更改时运行一段特定的代码。我把它作为一个 ExecuteListener 寻找的示例 DataChangedException . 它被注册为 Spring Bean 。

class LockingListener : DefaultExecuteListener() {

    override fun exception(ctx: ExecuteContext) {
        val exception = ctx.exception()

        if (exception is DataChangedException) {
            ctx.exception(IllegalStateException("Accessed data has been altered mid-operation."))
        }
    }
}
@Configuration
class JooqConfig {

    @Bean
    fun lockingListenerProvider() = DefaultExecuteListenerProvider(LockingListener())
}

我设置了一个断点 org.jooq.impl.ExecuteListeners#get 它看起来像是在旁边被捡起来的 LoggerListener 以及 JooqExceptionTranslator .
当我试着运行一个测试用例时, DataChangedException 不会被人发现 UpdateableRecord#update 我得到了下面的stacktrace,不是吗 IllegalStateException 就在眼前。

org.jooq.exception.DataChangedException: Database record has been changed or doesn't exist any longer
    at org.jooq.impl.UpdatableRecordImpl.checkIfChanged(UpdatableRecordImpl.java:540)
    at org.jooq.impl.UpdatableRecordImpl.storeMergeOrUpdate0(UpdatableRecordImpl.java:349)
    at org.jooq.impl.UpdatableRecordImpl.storeUpdate0(UpdatableRecordImpl.java:241)
    at org.jooq.impl.UpdatableRecordImpl.access$100(UpdatableRecordImpl.java:89)
    at org.jooq.impl.UpdatableRecordImpl$2.operate(UpdatableRecordImpl.java:232)
    at org.jooq.impl.RecordDelegate.operate(RecordDelegate.java:149)
    at org.jooq.impl.UpdatableRecordImpl.storeUpdate(UpdatableRecordImpl.java:228)
    at org.jooq.impl.UpdatableRecordImpl.update(UpdatableRecordImpl.java:165)

调试表明 LockingListener#exception 甚至没有进入。

a11xaf1n

a11xaf1n1#

这个例外不属于 ExecuteListener 生命周期,即处理与JDBCAPI交互的生命周期。换句话说,它不是一个 SQLException ,它发生在堆栈的更高位置。使用 RecordListener.exception() 而是回调。

相关问题