0

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

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

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 作为一个单独的 java 应用程序在 Heroku 上运行,而不是一个播放框架应用程序。所以我假设在 main 方法中创建 Play 应用程序的目的是访问 Web 应用程序和模型类的数据库。

更新

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

  1. 在控制台类型play中,然后在播放控制台类型$ h2-browser中。这将以 TCP 服务器模式启动 h2 数据库/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/startplay stage命令生成的脚本与来自 Procfile 的参数的混合。

  3. 执行另一个 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 命令末尾的点。这就是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 回答