0

私は、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 を使用してアプリケーションをローカルで実行することはできなかったので、実際にアプリケーションの動作を観察するために次の手順を実行しました。

  1. コンソール型playで、そしてプレイコンソール型で$ h2-browser。これにより、h2データベースがTCPサーバーモードで開始されます/localhost:9092/
  2. 次の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 からの引数を組み合わせたものです。

  3. 別のバット スクリプトを実行して、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]), ...)。それを理解するのに永遠にかかりました)。

ありがとう!

4

1 に答える 1

2

DefaultApplication代わりに使用する必要がありますApplication

public class TickJob {

    public static void main(String[] args) {

        Application application = 
            new DefaultApplication(new File(args[0]), TickJob.class.getClassLoader(), null, Mode.Prod());

        Play.start(application);

        Tick tick = new Tick("Hello from the TickJob");
        tick.save();
   }

}

API は次の場所にあります: http://www.playframework.com/documentation/api/2.1.0/scala/index.html#play.api.DefaultApplication

バージョン 2.1 で変更されました。

于 2013-03-22T17:48:15.923 に答える