2014-03-05 54 views
1

我擁有一個Play 2.2.2應用程序。Play 2.2.2 /只在一臺Heroku的測功機上運行一個調度程序:

實際部署在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,每個運行我的播放應用程序的實例。

現在我想在Global.scala的一臺測功機上啓動一個特定的Akka調度器。 只有一個,因爲它將專注於在數據庫中輪詢EventStore,其升序非常重要。

似乎可以使用命令選項-Dapplication.global=Global2.scala使用特定的Global.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請求的測試儀之一。
事實上,documentation狀態:

幅材工序類型是特殊的,因爲它是唯一的過程類型 將收到來自Heroku的路由器的HTTP流量。其他工藝類型 可以任意命名。

誰能給我一個提示?

回答

1

您可以在運行時獲得賽道名稱:

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

因此,在你的代碼,你可以通過檢查賽道變量運行阿卡調度:

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

但是,如果「web.1」是而且我需要一個新的測試儀來承載這個過程,這種硬編碼的方式不適合,不是嗎? – Mik378

相關問題