2016-07-13 10 views
1
Fehler

Mit Play-Framework-1.2.7 habe ich eine Klasse, die play.jobs.Job erweitert die Datenbank ausführt, schreibt (MongoDB Wiedergabe Moprhia Plugin)Play-Framework-1.2.7 Bootstrap-Job-Datenbank schreibt

Hier ist ein verkürztes Beispiel:

/* controller */ 
public static void doThings(@Required String id) { 
    User me = User.findById(id); 
    notFoundIfNull(me); 

    new MyJob(me).now(); 
} 

/* MyJob */ 
public class MyJob extends Job { 
    private final User me; 

    public MyJob(User me) { 
    this.me = me; 
    } 

    @Override 
    public void doJob() { 
     int newValue = me.someInt; 
     newValue++; 
     me.someInt = newValue; 
     me.save(); 
    } 
} 

Hier ist der seltsame Teil (komisch für mich jedenfalls):

die Schreib im doJob() Methode zum ersten Mal geschieht der Auftrag ausgeführt wird, manchmal ein zweites Mal, aber bei jeder zusätzlichen Instanziierung dieses Jobs tritt der Schreibvorgang nie auf. Es werden keine Ausnahmen ausgelöst.

Wenn ich die extends Job von MyJob nur entfernen, und dann rufen Sie einfach die MyJob Klasse, indem sie es selbst Instanziieren und Aufrufen doJob() es jedes Mal funktioniert:

/* controller */ 
public static void doThings(@Required String id) { 
    User me = User.findById(id); 
    notFoundIfNull(me); 

    new MyJob(me).doJob(); // assumes this class no longer Extends Job 
} 

Ich habe für 4 + Jahre Jetzt spielen benutze und Ich habe noch nie ein solches Verhalten gesehen, und ich weiß nicht, was tatsächlich passiert.

+0

Können Sie wickeln Ihre 'doJob()' Methode Körper in einen 'try {...} catch (Throwable t) {logger.error (t, "...");}' blockieren und sehen, was passiert ist? Sie können auch einen Haltepunkt innerhalb von 'doJob()' setzen und die Ausführung verfolgen? –

+0

Ich habe den Code über den Debugger ausgeführt, und hier ist die Sache. Wenn Sie durch den Code gehen, funktioniert es. die ganze Zeit. funktioniert immer so, wie es sollte. Wenn ich den Debugger abziehe, erscheint das Phantom, das nicht mehr in den DB schreibt. Es werden keine Ausnahmen ausgelöst. –

+0

Verwenden Sie JPA? Ich vermute, dass der Entity Manager-Status von JPA mit einem Kontext verknüpft ist, der Ihren aktuellen Aktionshandlingthread bedeutet. Während Sie es in einem separaten Thread ausführen, werden Sie wahrscheinlich versuchen, das selbst zu behandeln –

Antwort

0

Ich bin mir nicht sicher, aber ich denke, könnte ein (nicht behandelt) Konflikt auf Morphia-Plugin und speziell auf Context sein. Ich bin mir sicher, dass es im JPA-Modell für Play1 etwas sehr ähnliches gibt, wo es zwei Kontexte gibt.

Aus Ihrem Code stelle ich fest, dass das Objekt von Controller Context geladen und in Job Context gespeichert wird. Wenn Sie ohne Job auskommen, verwenden Morphia immer noch den Controller.

Versuchen Sie, ID übergeben und neu laden in Job, oder versuchen, JPDA remote Debug zu verwenden, fangen Sie jeden Aufruf (in Controller und Job), gehen tief in Play-Framework und vergleichen Kontextobjekt.

Viel Glück