Как мне подключиться к настойчивости воспроизведения (JPA) в актерах Akka?

Я использую игровую среду и JPA. Несколько сообщений передаются актерам Akka для асинхронной обработки. Внутри асинхронного процесса мне нужно подключить мою базу данных через JPA.

public class OrderCreation extends UntypedActor {

    private EntityManagerFactory emFact = null;
    private ActorSelection provisioner;

    @Transactional(readOnly = false)
    @Override
    public void onReceive(Object order) throws Exception {
        //HERE I need to do JPA related transactions



    }

    @Override
    public void postStop() throws Exception {
    }

    @Override
    public void preStart() throws Exception {
        provisioner =getContext().actorSelection("/user/OrderProvisioner");
        emFact = Persistence.createEntityManagerFactory("test-data-play");

    }
}

я получил эту ошибку

[akka://application/user/OrderCreation] No EntityManager bound to this thread. Try wrapping this call in JPA.withTransaction, or ensure that the HTTP context is setup on this thread.
java.lang.RuntimeException: No EntityManager bound to this thread. Try wrapping this call in JPA.withTransaction, or ensure that the HTTP context is setup on this thread.
    at play.db.jpa.JPA.em(JPA.java:58)

У кого-нибудь есть идея подключить JPA через Akka?


person Damith Ganegoda    schedule 24.04.2016    source источник
comment
JPA и akka никак не связаны друг с другом. Я бы не стал аннотировать метод onReceive, напрашиваясь на неприятности.   -  person Derrops    schedule 27.04.2016
comment
Я решил это, используя JPA.withTransaction, как говорится в сообщении об ошибке.   -  person kopelitsa    schedule 29.04.2016


Ответы (1)


@Transactional — это композиция действий, она будет работать только в контроллерах.

Вам нужно внедрить JPAApi в своего актера и использовать метод jpaApi.withTransaction для создания/присоединения EntityManager к потоку и переноса вашего кода в транзакцию.

person RP-    schedule 03.05.2016