【问题标题】:Play 2.2.2 / Running a scheduler on only one Heroku's dyno:播放 2.2.2 / 仅在一个 Heroku 的测功机上运行调度程序:
【发布时间】:2014-03-05 12:26:41
【问题描述】:

我拥有一个 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 个网络测功机,每个都运行我的 Play 应用程序实例。

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

似乎可以使用命令选项-Dapplication.global=Global2.scala 使用特定的Global.scala 来指定特定的实例。
这会很棒,因为我可以创建一个 Global2.scala 运行调度程序,同时让 Global.scala 保持不变并由所有其他测功机使用。

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 流量。其他工艺类型 可以任意命名。

谁能给我一个提示?

【问题讨论】:

    标签: heroku playframework-2.0 playframework-2.2


    【解决方案1】:

    您可以在运行时获取测功机名称:

    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()
            );
    }
    

    【讨论】:

    • 但是如果“web.1”关闭了,并且我需要一个新的测功机来承载这个过程,那么这种硬编码的方式就不适合了,不是吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 2013-01-23
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多