播放2.2.2 /仅在一个Heroku的dyno上运行调度程序:

时间:2014-03-05 12:26:42

标签: heroku playframework-2.0 playframework-2.2

我拥有Play 2.2.2应用程序。

实际部署在Heroku上,我有这样的配置:

$heroku ps 

=== web (1X): `target/universal/stage/bin/myWebApp -Dconfig.resource=prod.conf  -Dhttp.port=${PORT}`
web.1: up 2014/03/05 03:53:05 (~ 9h ago)
web.2: up 2014/03/05 04:10:03 (~ 9h ago)

所以我拥有2个网络dynos,每个都运行我的Play应用程序的实例。

现在我想在Global.scala上只在一个dyno上启动一个特定的Akka调度程序。 只有一个,因为它将专注于轮询数据库中的EventStore,其升序非常重要。

似乎可以使用命令选项Global.scala使用特定-Dapplication.global=Global2.scala指定特定实例。
这很好,因为我可以创建Global2.scala运行调度程序,同时让Global.scala不受所有其他dynos的影响。

ProcFile应如何指定添加调度程序的dyno?

目前我有这个:

web: target/universal/stage/bin/myWebApp -Dconfig.resource=prod.conf  -Dhttp.port=${PORT}

我遇到了这个post,但答案中给出的程序对我来说不是很清楚..

应该是:

web: target/universal/stage/bin/myWebApp -Dconfig.resource=prod.conf -Dhttp.port=${PORT}
singleton: `target/universal/stage/bin/myWebApp -Dconfig.resource=prod.conf -Dhttp.port=${PORT} -Dapplication.global=Global2.scala`

并制作:

heroku ps:scale singleton=1

缺点是我会丢失一个用于处理用户HTTP请求的dyno 确实,documentation州:

  

Web流程类型很特殊,因为它是唯一的流程类型   将从Heroku的路由器接收HTTP流量。其他流程类型   可任意命名。

有人能给我一个提示吗?

1 个答案:

答案 0 :(得分:1)

您可以在运行时获取dyno名称:

String dyno = System.getenv("DYNO");

因此,在您的代码中,您可以通过检查dyno变量来运行Akka调度程序:

if(dyno.equals("web.1")) {
       Akka.system().scheduler().scheduleOnce(
                Duration.Zero(),
                new Runnable() {
                    public void run() {
                    // do something
                    }
                },
                Akka.system().dispatcher()
        );
}