Как внедрить Сессию Hibernate в асинхронный слушатель в микронавтом? - PullRequest
1 голос
/ 19 октября 2019

Я пытаюсь внедрить сеанс Hibernate в слушатель, запрограммированный для работы в рабочем потоке.

Итак, у меня есть событие такого типа.

public class SomeEvent {
    public long id;
    public Double value;
}

И я выталкиваю его из службы.

import javax.inject.Singleton;
import io.micronaut.context.event.ApplicationEventPublisher;

@Singleton
public class SomeService {

    public void createAndPublish(Create payload) {
        Record record = this.create(payload);
        Long id = record.getId();
        record.setValue(10);
        assert id != null;

        SomeEvent event = new SomeEvent();
        event.id = id;
        event.value = 10;

        publisher.publishEvent(event);
    }
}

А это мой слушатель

import javax.persistence.EntityManager;
import javax.inject.Singleton;
import io.micronaut.runtime.event.annotation.EventListener;
import io.micronaut.scheduling.annotation.Async;
import io.micronaut.spring.tx.annotation.Transactional;
import io.micronaut.configuration.hibernate.jpa.scope.CurrentSession;

@Singleton
public class SomeEventListener {

    protected EntityManager em;

    public SomeEventListener(@CurrentSession EntityManager em) {
        this.em = em;
    }


    @Transactional
    @EventListener
    @Async
    onSomeEvent(SomeEvent event) {
        // Do something with event..
    }
}

Но микронавт не смог создать сеанс Hibernate.

01:10:05.017 [pool-1-thread-3] ERROR i.micronaut.scheduling.TaskExecutors - Error occurred executing @Async method [void onSomeEvent(SomeEvent event)]: Error instantiating bean of type [org.hibernate.Session]: Could not obtain transaction-synchronized Session for current thread
...