在Play Framework 2应用程序中检索端口号

时间:2013-02-20 01:17:11

标签: playframework-2.0

问题是:如何检索播放正在侦听的端口号,无论它是如何定义的(配置,命令行参数,或根本没有)。

此答案Retrieving port number in-application using Play Framework必须适用于Play v1,因为该代码无法编译。

在Play 2 Java中有:

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

这不会返回实际的端口号,至少在所有情况下都不会。如果Play以:

运行
run 80 -Dhttp.address=example.com

然后它返回null

如果播放

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

然后在默认端口(9000)上开始播放。

正如biesior所指出的那样,两次提到港口是有效的:

play -Dhttp.port=80 "run 80"

这当然不是最佳的,因为Play实际上使用的是另一个,它是报告的内容。

但它会回答我关于开发模式的问题。但是,正如文档所说,Play永远不应该使用run生成。那么start命令的等价物是什么,并没有更好,更安全的方法吗? (我对Java版本很感兴趣,但其他人也可能想了解Scala。)

3 个答案:

答案 0 :(得分:3)

在开发模式下运行时,您需要使用双重表示法

play -Dhttp.port=80 "run 80"

不幸的是,您必须对默认端口

执行相同的操作
play -Dhttp.port=9000 "run 9000"

所以我建议编写shell脚本(或Windows中的.bat),以便轻松启动所有必需的参数。

答案 1 :(得分: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。)

答案 2 :(得分: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.
    ...
} }