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.
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? –
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. –
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 –