使用playframework 2.1编译play2计划作业演示

使用playframework 2.1编译play2计划作业演示,playframework,scheduled-tasks,background-process,web-worker,playframework-2.1,Playframework,Scheduled Tasks,Background Process,Web Worker,Playframework 2.1,我正在开发Play Framework 2.1应用程序,它应该使用Heroku worker dyno单元来执行耗时的后台工作。有一些关于如何做到这一点的一般性讨论,但没有那么多实际的例子 詹姆斯·沃德的例子看起来非常接近我想要实现的目标: 它是为Play Framework 2.0.1实现的,因此我仔细地将项目文件转换为2.1版本。不幸的是,由于TickJob.java中的错误,项目无法编译 package jobs; import models.Tick; import play.api

我正在开发Play Framework 2.1应用程序,它应该使用Heroku worker dyno单元来执行耗时的后台工作。有一些关于如何做到这一点的一般性讨论,但没有那么多实际的例子

詹姆斯·沃德的例子看起来非常接近我想要实现的目标:

它是为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
显然,这是API 2.0.1和2.1.0变化的结果。那么2.1.0如何解决这个问题呢

据我所知,TickJob类中的主要方法是worker进程的入口点。从Procfile可以清楚地看出,TickJob是作为一个单独的java应用程序而不是play框架应用程序在Heroku上运行的。因此,我假设在这里的main方法中创建Play应用程序的目的是访问web应用程序和模型类的数据库

更新

编译的问题现在已经解决了。我无法在Windows XP上使用Foreman在本地运行应用程序,因此我采取了以下步骤来实际观察应用程序的运行情况

  • 在控制台类型中播放,然后在播放控制台类型中播放$h2浏览器。这将在
    /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/..
    
    这是由
    play stage
    命令生成的
    target/start
    脚本与Procfile中的参数的混合

  • 执行另一个bat脚本来触发后台作业进程,该进程连接到与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命令末尾的点。它在
    newdefaultapplication(新文件(args[0]),…)中作为
    args[0]
    传递。我花了很长时间才弄明白)


    谢谢

    您必须使用
    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可在此处找到:


    它在2.1版本中已更改。

    对此表示抱歉。我会尽快将此更新为Play 2.1。我的代码已更新为Play 2.1.0。谢谢您的回复。您的代码示例非常有用。@nico_ekito的回答解决了2.1的编译问题。现在我被困在Win XP的Foreman上运行它。