【发布时间】: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 在本地运行应用程序,因此我采取了以下步骤来实际观察应用程序的运行情况。
- 在控制台中输入
play,然后在游戏控制台中输入$ h2-browser。这将在/localhost:9092/上以 TCP 服务器模式启动 h2 数据库 -
执行以下 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 命令末尾的点。这是在 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