2016-10-21 7 views
2

定期的なレポートジョブを設定しようとしています。レポートはユーザーとのやりとりなしに作成され、アプリケーション開始時にジョブがスケジュールされます。Apache ISISのプログラムによるアクションの呼び出し

バックグラウンドサービスとスケジューラが動作しています。 UIのボタンとしてcreateReportアクションを公開すると、次回ジョブがトリガーされたときにレポートが作成されます。しかし、このレポートは、ユーザーの介入なしに繰り返し作成する必要があります。

私は、プログラムでアクションを呼び出す方法が問題だと思いますか? createReport()をドメインサービスに移動し、@PostConstructアノテーション付きメソッドで呼び出すと例外が発生します(IsisCommandにコマンドを保持しようとしています)。私はアクション呼び出しのために何らかのコンテキストを持っていなければならないと思っていますか?または私はこれに間違った方法で近づいていますか?ありがとう!

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

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

答えて

3

単にメソッドを繰り返し呼び出す場合は、いくつかのオプションがあります。

BackgroundServiceは、後で取り上げられるアクション呼び出しのメモを作成して保持します(isisaddonsのisis-command-moduleを使用してこれをすぐに実装できます)既に)。

コマンドが永続化されるとき、アクションをラップする必要があります。つまり、@Programmaticで注釈を付けることはできません。それが一つのことです。

次は、このアクションは継続的に繰り返されるため、次のバックグラウンド呼び出しを作成する必要があります。

理論的には、createReport(...)の最後のメソッド呼び出しとしてbackgroundService.execute(this).createReport(...)を使用できます。最新のバグ修正(1.13.1でリリースされましたが)が確実に動作するように注意してください。当社のKanban boardをご覧ください。

バックグラウンドコマンドサービスを完全に無視してAbstractIsisSessionTemplateを使用してから、RunBackgroundCommandsJobのようなカスタムQuartzジョブから呼び出してください。

あなたのコード例では、commandExecuteIn = BACKGROUNDを使用してアクションに注釈を付けました。これは、フレームワークが自動的にアクションをコマンドとして保持することを意味します。暗黙的にbackgroundCommand.execute(this).xxx()を呼び出しているとします。アクションの実装自体の中でその呼び出しを行う必要はありません。

HTH ダン

+0

ありがとうございました!私が必要とした情報だけ。 2番目のアプローチを行ったとうまく動作します。 – user5806139

関連する問題