私は、Heroku ワーカー dyno ユニットを使用して時間のかかるバックグラウンド ジョブを実行する Play Framework 2.1 アプリケーションに取り組んでいます。それを行う方法については、いくつかの一般的な議論がありますが、実用的な例はあまりありません。
この James Ward の例は、私が達成したいものに非常によく似ています。
https://github.com/jamesward/play2-scheduled-job-demo
これは Play Framework 2.0.1 用に実装されているため、プロジェクト ファイルを慎重に 2.1 バージョンに変換しました。残念ながら、TickJob.java のエラーのため、プロジェクトはコンパイルされません。
package jobs;
import models.Tick;
import play.api.Play;
import play.api.Mode;
import play.api.Application;
import java.io.File;
public class TickJob {
public static void main(String[] args) {
Application application =
new Application(new File(args[0]), TickJob.class.getClassLoader(), null, Mode.Prod());
Play.start(application);
Tick tick = new Tick("Hello from the TickJob");
tick.save();
}
}
エラーのログは次のとおりです。
TickJob.java:15: play.api.Application is abstract; cannot be instantiated
どうやらこれは、2.0.1 および 2.1.0 の API の変更の結果です。では、これを 2.1.0 で修正するにはどうすればよいでしょうか?
私の知る限り、TickJob クラスのメイン メソッドはワーカー プロセスのエントリ ポイントです。Procfile から、TickJob が Play フレームワーク アプリケーションではなく、別の Java アプリケーションとして Heroku 上で実行されていることが明らかです。したがって、ここでメイン メソッドで Play アプリケーションを作成する目的は、Web アプリケーションのデータベースとモデル クラスにアクセスすることであると想定しています。
アップデート
コンパイルの問題は修正されました。Windows XP で Foreman を使用してアプリケーションをローカルで実行することはできなかったので、実際にアプリケーションの動作を観察するために次の手順を実行しました。
- コンソール型
play
で、そしてプレイコンソール型で$ h2-browser
。これにより、h2データベースがTCPサーバーモードで開始されます/localhost:9092/
次のbatスクリプトを実行して、ポート9000でplay Webアプリケーションを起動し、データベースに接続します
set PORT=9000 set DATABASE_URL=jdbc:h2:tcp:localhost:9092/mem/play java -Dhttp.port=%PORT% -Ddb.default.url=%DATABASE_URL% -DapplyEvolutions.default=true -cp "target/staged/*"; play.core.server.NettyServer target/..
これは、コマンド
target/start
によって生成されたスクリプトplay stage
と Procfile からの引数を組み合わせたものです。別のバット スクリプトを実行して、Web プロセスと同じデータベースに接続されるバックグラウンド ジョブ プロセスをトリガーします。これがこの例の要点です。
set DATABASE_URL=jdbc:h2:tcp://localhost:9092/mem/play java -Dconfig.file=conf/application.conf -Ddb.default.url=%DATABASE_URL% -cp "target/staged/*"; jobs.TickJob . pause
java コマンドの最後のドットを忘れないでください。のように渡されるものargs[0]
ですnew DefaultApplication(new File(args[0]), ...)
。それを理解するのに永遠にかかりました)。
ありがとう!