I currently have a Micronaut data Listener created following micronaut guide:
@Factory
class LoadToContractLaneListeners(
private val myProducer: MyProducer,
private val myRepository: MyRepository,
) {
private fun send(myBean: MyBean) =
CoroutineScope(Dispatchers.IO).launch {
myProducer.produce { myBean.countByIdAndRankMatchTrue(myBean.id) }
}
@Singleton
fun postPersist() = PostPersistEventListener(::send)
@Singleton
fun postDelete() = PostRemoveEventListener(::send)
}
The repo is:
@Repository(Constants.SCHEMA)
@Transactional(Constants.SCHEMA)
@Introduction
@Retention(AnnotationRetention.RUNTIME)
@Target(AnnotationTarget.CLASS)
@Type(DataIntroductionAdvice::class)
@Singleton
interface MyRepository : JpaRepository<MyBean, UUID> {
fun countByIdAndRankMatchTrue(id: UUID): Int
When running a test on this listener I am getting the following code:
Exception in thread "io-executor-thread-5 @coroutine#41" java.lang.IllegalStateException: Transaction already active
at org.hibernate.engine.transaction.internal.TransactionImpl.begin(TransactionImpl.java:74)
at org.hibernate.internal.AbstractSharedSessionContract.beginTransaction(AbstractSharedSessionContract.java:529)
at io.micronaut.transaction.hibernate.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:162)
at io.micronaut.transaction.hibernate.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:60)
at io.micronaut.transaction.support.AbstractTransactionOperations.begin(AbstractTransactionOperations.java:348)
at io.micronaut.transaction.support.AbstractTransactionOperations.executeTransactional(AbstractTransactionOperations.java:330)
at io.micronaut.transaction.support.AbstractTransactionOperations.executeWithNewTransaction(AbstractTransactionOperations.java:318)
at io.micronaut.transaction.support.AbstractTransactionOperations.executeNew(AbstractTransactionOperations.java:235)
at io.micronaut.transaction.support.AbstractTransactionOperations.doExecute(AbstractTransactionOperations.java:137)
at io.micronaut.transaction.support.AbstractTransactionOperations.doExecute(AbstractTransactionOperations.java:125)
at io.micronaut.transaction.support.AbstractPropagatedStatusTransactionOperations.execute(AbstractPropagatedStatusTransactionOperations.java:65)
at io.micronaut.transaction.interceptor.TransactionalInterceptor.intercept(TransactionalInterceptor.java:140)
at io.micronaut.aop.chain.MethodInterceptorChain.proceed(MethodInterceptorChain.java:137)
The test is made using kotest and declaring the test class with transactional = false in the annotation.
Any idea on what’s going on?