我正在开发 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 在本地运行应用程序,因此我采取了以下步骤来实际观察应用程序的运行情况。
- 在控制台类型
play
中,然后在播放控制台类型$ h2-browser
中。这将以 TCP 服务器模式启动 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/..
这是
target/start
由play stage
命令生成的脚本与来自 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 命令末尾的点。这就是args[0]
在new DefaultApplication(new File(args[0]), ...)
. 我花了很长时间才弄清楚)。
谢谢!