我的應用程式上下文定義為位於my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml
.
<Context docBase='/my/path/to/myApp/myAppWarFile.war'>
<Environment name='my_config_dir' value='/my/path/to/myApp' type='java.lang.String'/>
</Context>
/my/path/to/myApp
包含 WAR 檔案 myAppWarFile.war 和 Spring 讀取的許多外部化屬性。
Tomcat 配置為關閉 autoDeploy。當我啟動 Tomcat 時,它會創建my/path/to/Tomcat/conf/webapps/my-app/
WAR 檔案並按預期將其解壓縮到此位置,並且應用程式當然可以按預期運行。
當我想在不重新啟動 Tomcat 的情況下部署新版本時,我執行 undeploy 命令,如下所示:
curl http://localhost:8080/manager/text/undeploy?path=/my-app --user my-username:my-password
……這有效。但是,當我指示 Tomcat 使用以下curl 語句進行部署時,我遇到了失敗。
curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml --user my-username:my-password
# Tomcat response
FAIL - Invalid context path null was specified
新增路徑並沒有多大幫助,我仍然失敗。
curl http://localhost:8080/manager/text/deploy?config=file:/my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml\&path=/my-app --user my-username:my-password
# Tomcat response
FAIL - Failed to deploy application at context path /my-app
最糟糕的是追蹤 catalina.out 並不能產生任何洞察力。最重要的是,Tomcat 刪除了應用程式上下文 XML 檔案my/path/to/Tomcat/conf/Catalina/localhost/my-app.xml
!
當然,我已經查看了 Tomcat 文檔(https://tomcat.apache.org/tomcat-8.0-doc/manager-howto.html#Deploy_using_a_Context_configuration_%22.xml%22_file)並且我已經用谷歌搜尋了一整天來解決這個問題,但是我沒有找到任何可以幫助我完成這個特定配置的東西。
感覺好像選擇是:
- Tomcat 啟用了 autoDeploy(不建議用於生產),在這種情況下,只需將新的 WAR 刪除即可
/my/path/to/myApp/
導致 Tomcat 熱部署應用程式。 - Tomcat 的 autoDeploy 已關閉,但重新部署需要重新啟動 Tomcat,因為部署 API 似乎並未像宣傳的那樣運作。
有人用這個配置完成這個工作嗎?
編輯:
我打開了卡塔琳娜的日誌記錄。當我在沒有路徑的情況下執行第一個部署命令時,我得到這組日誌條目:
FINE: Start processing with input [config=file:/my/apth/to/tomcat/conf/Catalina/localhost/my-app.xml]
Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [OPEN]
Oct 13, 2015 10:04:53 AM org.apache.coyote.http11.AbstractHttp11Processor process
FINE: Error parsing HTTP request header
java.io.EOFException: Unexpected EOF read on the socket
at org.apache.coyote.http11.Http11Processor.setRequestLineReadTimeout(Http11Processor.java:168)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:982)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:744)
Oct 13, 2015 10:04:53 AM org.apache.coyote.AbstractProtocol$AbstractConnectionHandler process
FINE: Socket: [org.apache.tomcat.util.net.SocketWrapper@189651c1:Socket[addr=/0:0:0:0:0:0:0:1,port=45415,localport=8080]], Status in: [OPEN_READ], State out: [CLOSED]
Oct 13, 2015 10:04:53 AM org.apache.tomcat.util.threads.LimitLatch countDown
FINE: Counting down[http-bio-8080-exec-16] latch=1
答案1
這個問題是一個普遍問題。對於二進位可移植 war 文件,上下文配置(環境)位於其應在的上下文中,而不是在 war 檔中。重新部署時,例如套用軟體修補程式時,容器(Tomcat)應重新部署而不刪除上下文。
這個問題正在解決從戰爭重新部署而不刪除上下文。顯然,假設文字介面已經可以實現這一點,因此不可能實現這一點的情況可以被視為錯誤。
建議的解決方案是觀察此 Tomcat 問題直至其解決,因為此伺服器故障問題會成為其重複問題。