2015-01-12 133 views
0

我有一個Grails 2.3.6應用程序作爲服務器中的WAR文件運行。目前它運行在Tomcat 7上。Grails:WAR文件部署:查找端口

將來我們可能會在其他服務器上運行該應用程序。

現在我面臨的問題是獨特的。在其中一個服務groovy文件中,我需要獲取正在運行的應用程序的端口號。

對於Tomcat,端口號設置爲server.xml並且有一種可能的方式可以從那裏讀取。

但我正在尋找更通用的解決方案。因此,即使WAR文件部署在其他類型的服務器上,我也可以獲得端口號。

歡迎任何建議!

回答

3

端口(單數)不一定是明確定義的,例如,您可以使用多個連接器監聽不同端口或配置http和https來配置Tomcat。在特定請求的上下文中,您可以談論該請求已收到的「端口」,但是如果您的應用程序位於反向代理或負載平衡器後面會發生什麼情況...

唯一可靠的方法是在配置文件中手動指定適當的端口號/ URL /無論如何(例如grails.config.locations external)。

+0

我如果這個屬性被設置正確,然後讓在服務的端口是一樣簡單仍然希望探索動態獲取端口號的可能性,而不考慮應用程序運行的服務器:-) – donguy76

+0

@ donguy76再次閱讀我的答案 - 只有_no_沒有可靠的方法來執行此操作。我正在處理的一個典型的webapp運行在一個帶有兩個連接器的tomcat上,端口8456和8457位於Apache httpd反向代理的後面,分別在端口80和443上顯示給全世界。您認爲這四個數字中的哪一個是該應用的「端口號」? –

+0

不知道!所以我的問題是,如果沒有代理參與,那麼是否有可靠的方法來獲取端口號? – donguy76

1

您可能需要將grails.serverURL配置屬性設置爲應用程序的基礎根目錄。在development環境中,這是典型的像

grails.serverURL = "https://localhost:8080/example" 

,並在production環境

grails.serverURL = "https://example.org" 

如果不設置這個正確的,有些事情是行不通的,例如生成絕對URL。

class MyService { 

    def grailsApplication 

    Integer getPort() { 
    String basePath = grailsApplication.config.grails.serverURL 
    // parse out the path (exercise for reader) 
    } 
} 
+0

我想避免在config.froovy文件中對地址+端口進行硬編碼。 – donguy76

1

如果您需要在服務的端口,你可以從HttpServletRequest中獲取它,如下所示:

HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest() 
def port = request.getServerPort() 
+0

由於某種原因,它在服務中不起作用。 – donguy76

+0

你得到了哪個錯誤? –

+0

不幸的是我沒有看到Grails應用程序拋出異常。當我嘗試調試時,它會到達該線路並去其他地方。我之所以說它不工作的原因是因爲,之後的代碼沒有得到執行。 – donguy76