2016-10-21 3 views
2

Ich versuche, einen regelmäßigen Bericht Job einzurichten. Der Bericht muss ohne Benutzerinteraktion erstellt werden und der Job muss beim Start der Anwendung geplant werden.Apache ISIS Call-Aktion programmgesteuert

Ich habe den Hintergrund Service und Scheduler arbeiten. Wenn ich die createReport-Aktion als eine Schaltfläche in der Benutzeroberfläche verfügbar mache, wird ein Bericht erstellt, wenn der Job das nächste Mal ausgelöst wird. Dieser Bericht muss jedoch wiederholt und ohne Benutzerinteraktion erstellt werden.

Ich denke, die Frage ist, wie programmgesteuert eine Aktion aufrufen? Das Verschieben von createReport() in einen Domänenservice und das Aufrufen in einer annotierten Methode @PostConstruct führt zu einer Ausnahme (versucht, den Befehl für IsisCommand beizubehalten). Ich vermute, dass ich einen Kontext für die Aktion aufrufen muss? Oder nähere ich mich dem in die falsche Richtung? Vielen Dank!

@Action(command = CommandReification.ENABLED, 
     commandExecuteIn=CommandExecuteIn.BACKGROUND) 
public Command createReport() { 
    backgroundService.execute(this).generateReport(); 
    return commandContext.getCommand(); 
} 

@Programmatic 
public void generateReport() { 
    .... 
} 

Antwort

3

Wenn Sie einfach eine Methode wiederholt aufrufen möchten, gibt es ein paar Optionen.

Der BackgroundService erstellt und speichert eine Erinnerung an einen Aktionsaufruf, der später abgeholt werden soll (mit dem isisaddons 'isis-command-Modul, das eine sofort einsetzbare Implementierung dieser ... bietet bereits).

Wenn ein Befehl beibehalten wird, muss er eine Aktion umbrechen, dh er kann nicht mit @Programmatic kommentiert werden. Das ist eine Sache.

Die nächste ist, dass, da diese Aktion kontinuierlich wiederholt werden soll, etwas den nächsten Hintergrundaufruf erzeugen muss.

Theoretisch könnten Sie backgroundService.execute (this) .createReport (...) als letzten Methodenaufruf in createReport (...) verwenden; ein Vorbehalt ist, dass einige kürzlich behobene Bugfixes (gemacht, aber noch in 1.13.1 veröffentlicht werden), um dies zuverlässig funktionieren zu lassen; siehe unsere Kanban board.

Ein insgesamt einfacherer Ansatz könnte sein, den Hintergrund-Befehlsdienst vollständig zu ignorieren und einfach AbstractIsisSessionTemplate zu verwenden, und dann von einem benutzerdefinierten Quartz-Job ähnlich wie RunBackgroundCommandsJob aufzurufen.

Eine letzte Sache: In Ihrem Codebeispiel notierten Sie die Aktion mit commandExecuteIn = HINTERGRUND. Das bedeutet, dass das Framework die Aktion automatisch als Befehl vereinheitlicht/persistiert ... stellen Sie sich vor, dass es im Hintergrund backgroundCommand.execute (this) .xxx() für Sie aufruft. Es ist nicht notwendig, diesen Aufruf auch innerhalb der Aktionsimplementierung selbst durchzuführen.

HTH Dan

+0

Vielen Dank! Genau die Informationen, die ich brauchte. Ging mit dem zweiten Ansatz und es funktioniert gut. – user5806139

Verwandte Themen