【问题标题】:Compile play2-scheduled-job-demo with playframework 2.1使用 playframework 2.1 编译 play2-scheduled-job-demo
【发布时间】:2013-03-23 07:03:52
【问题描述】:

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

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

更新

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

  1. 在控制台中输入play,然后在游戏控制台中输入$ h2-browser。这将在/localhost:9092/ 上以 TCP 服务器模式启动 h2 数据库
  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/..
    

    这是由play stage 命令生成的target/start 脚本与来自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 命令末尾的点。这是在 new DefaultApplication(new File(args[0]), ...) 中作为 args[0] 传递的内容。我花了很长时间才弄清楚)。

谢谢!

【问题讨论】:

  • 很抱歉。我会尽快更新到 Play 2.1。
  • 我的代码已更新为 Play 2.1.0。
  • 感谢您的回复。您的代码示例非常有用。 @nico_ekito 的回答解决了 2.1 的编译问题。现在我只能在 Win XP 的 Foreman 上运行它。

标签: playframework scheduled-tasks background-process web-worker playframework-2.1


【解决方案1】:

你必须使用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 版本中有所改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    • 2020-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    相关资源
    最近更新 更多