2013-02-20 61 views
7

問題是:如何檢索播放正在偵聽的端口號,而不管它是如何定義的(配置,命令行參數或完全不)。檢索Play Framework 2應用程序中的端口號

此答案Retrieving port number in-application using Play Framework必須用於Play v1,因爲該代碼無法編譯。

在播放2 Java的有:

Integer port = Play.application().configuration().getInt("http.port"); 

不返回實際的端口號,至少不會在所有情況下。如果Play運行如下:

run 80 -Dhttp.address=example.com 

然後它返回null

如果Play運行爲

run -Dhttp.port 80 -Dhttp.address=example.com 

然後播放默認端口(9000)上啓動。

由於biesior指出它的工作原理是提口兩次:

play -Dhttp.port=80 "run 80" 

這當然不是最佳的,因爲一個是玩什麼實際使用,而另一個是它的報告。

但它會回答我的問題的開發模式。但是,正如文檔所述,Play不應該在產品中使用run運行。那麼start命令的等價物是什麼,並且沒有更好,更安全的方法嗎? (我感興趣的Java版本,但其他人可能想了解斯卡拉過。)

+0

只是一個說明......你真的不應該在端口80上運行Play(至少在Unix上)。因爲這要求您以root身份運行Play,這不是一件安全的事情。 – 2013-03-04 04:55:25

回答

3

運行在開發模式下,你需要使用一倍符號

play -Dhttp.port=80 "run 80" 

不幸的是你必須做的默認相同端口

play -Dhttp.port=9000 "run 9000" 

因此,我只是建議編寫shell腳本(或Windows中的.bat),以便輕鬆啓動所有必需的參數。

+1

在生產中,使用'start'命令(無參數),我仍然得到'null'而不是實際的'9000'。 – 2013-02-21 15:03:17

0

我使用這個Scala片段來確定Play的監聽端口。不幸的是,我不得不硬編碼一些默認值,如果沒有指定-Dhttp.port=...

val listenPort = 
    if (!Play.isTest) { 
    System.getProperty("http.port", "9000") 
    } 
    else { 
    // Not on classpath: play.api.test.Helpers.testServerPort 
    // Instead, duplicate its implementation here: 
    System.getProperty("testserver.port", "19001") 
    } 

我還想知道是否沒有更好的方法,例如, Play.port但我沒有發現任何東西 - 除了良好您的問題:-)

(在你的榜樣,它應該是-Dhttp.port=80-Dhttp.port 80

0

我剛剛找到一種方式來獲得該端口無論怎麼該端口已指定。使用反向路徑獲取Call對象,並使用absoluteUrl()方法獲取包含端口的動作的絕對URL。代碼片段:

public class RouteController extends Controller { 
public Promise<Result> getPortAction() { 
    Call call = com.mycom.routes.RouteController.getPortAction(); 
    String absoluteUrl = call.absoluteURL(request()); 
    //Here absoluteUrl would be like http://localhost:9002/...., 9002 would be the port. 
    ... 
} } 
+1

如果您可以優化此代碼示例,我會盡快回復您的回覆。如你所暗示的,最好不要詢問配置。在尋找端口號時。原則上,你的答案是理想的,但我無法實現。 – 2016-03-13 17:16:53

+0

這完全沒有幫助,因爲「absoluteURL()」方法實際上只計算URI的本地路徑部分。服務器和端口被省略或設置爲包含「absoluteURL()」的參數。 – 2016-10-16 12:27:30

相關問題