2016-04-24 13 views
1

Ich benutze Spiel-Framework und JPA. Nur wenige Nachrichten werden an die Akka Actors zur asynchronen Verarbeitung übergeben. Im Async-Prozess muss ich meine Datenbank über JPA verbinden.Wie verbinde ich mich mit Play Persistence (JPA) in Akka-Darstellern?

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"); 

    } 
} 

bekam ich diesen Fehler

[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) 

Jeder hat eine Idee JPA durch Akka zu verbinden?

+0

JPA und akka haben nichts miteinander zu tun. Ich würde die onReceive-Methode nicht kommentieren und um Ärger bitten. – Snickers3192

+0

Ich löste das mit JPA.withTransaction, genau wie die Fehlermeldung sagt – kopelitsa

Antwort

0

@Transactional ist eine Aktion Zusammensetzung, wird es nur arbeiten in Controllern.

Sie müssen JPAApi in Ihrem Akteur injizieren und jpaApi.withTransaction Methode verwenden, um EntityManager zu dem Thread zu erstellen/anzuhängen und Code innerhalb einer Transaktion zu umbrechen.