2012-01-09 43 views
8

我知道Tomcat和Servlet規範do not support starting webapps in a particular orderTomcat - 以特定順序啓動webapps

但是,在我看來,這似乎是一個常見的用例,我想知道是否有人發現了一個聰明的解決方法。

我有一個web應用程序A使用Spring Remoting來公開一個共享服務,其中webapp B是一個客戶端。除非webapp A正在運行,否則Webapp B不能初始化。但是,我的Tomcat始終以線性方式啓動webapps,從webapp B開始。

由於基礎設施的原因,我必須在同一個Tomcat服務器上運行這些程序。

任何想法?

感謝, 羅伊

UPDATE -

原來,在我的具體情況,順序並不重要。原因是這樣的:假設我使用下面的方法之一在應用程序B之前啓動應用程序A.所以應用程序A啓動,但是,由於Spring遠程處理使用的是HTTP Invoker,因此HTTP端口尚未打開(它不會打開直到全部應用程序啓動)。所以A將開始,B將掛起,因爲它正在查找的端口尚未可用。衛生署。

最終結果是兩個獨立的Tomcat實例。

+0

讓Web應用程序需要等待其他Web應用程序等待而不是失敗並放棄。 – 2012-01-09 19:37:34

+1

Hey Dave,unf。他們並不是平行開始的.B開始(當然,嘗試開始),然後A會在之後開始。但是如果B由於無法連接到A而無法啓動,A永遠不會嘗試啓動。 – 2012-01-09 19:43:25

+1

它應該以ASCII順序啓動它們。我在Debian Apache安裝中看到的一個技巧是創建一個000_default,001_default命名約定。這使得查看dir列表的ASCII順序時會更清楚一些。 – speeves 2012-01-09 20:12:35

回答

3

我們遇到了同樣的問題,爲了解決這個問題,我們依靠這個事實(滑溜,我知道)應用程序按照<tomcat_home>/conf/server.xml中定義的順序啓動。

這當然有一個在server.xml硬編碼應用程序的缺點,但我們可以忍受它。

+0

感謝mindas--這可能是最好的方法,但unf卻不適合我 - 我會編輯我的問題來解釋原因。 – 2012-01-10 15:40:02

1

在理論上可以在contextInitialized()這反過來又在檢查的時間間隔的其他Web應用程序的可用性產生一個Runnable通過ExecutorService(可能發射了HTTP請求HEAD?)。一旦其他Web應用程序可用,然後在servlet上下文中設置一些指示該屬性的屬性。添加一個Filter它檢查是否存在該屬性並相應地阻止/繼續請求。

0

這是一個很好的技巧,我用它來創建2個級別的webapp加載。在每個級別的順序不保證。這依賴於tomcat將從tomcat/conf/[Engine Name]/[Host Name]加載第一個上下文描述符,然後才從server.xml中的Host元素的appBase屬性加載上下文

只需添加以下內容代碼某處在webapp你想在第二級負載(即後來)

File contextDescriptor = new File(getParameter("catalina.home"),"/conf/Catalina/localhost/mywebapp.xml"); 
contextDescriptor.deleteOnExit(); 
3

這是很容易做到,如果你不小心黑客一點Tomcat的代碼,並創建自己的主機實例

1)創建一個org.apache.catalina.core的子類。StandardHost,說MYHOST:

class MyHost extends org.apache.catalina.core.StandardHost{ 
     public MyHost(){ 
     super(); 
     //changing HashMap for a predictable ordered Map :) 
     this.children = new LinkedHashMap(); 
     } 
    } 

2)在你的服務器的XML主機標籤()

令人難以置信,因爲它看起來,它解決了問題登記類,只要你有你的所有Web應用程序中聲明主機標籤內的正確順序:

<Host> 
    <context app1> 
    <context app2> 
    </Host> 

Thaen APP1 APP2會開始前,無論所以你使用它。

+1

第一步之後,我們應該在哪裏放置MyHost類?你能否詳細說明一下。 – abi1964 2014-10-22 06:10:29

+0

我們可以舉一個主機配置的例子 – 2018-03-06 08:29:29

1

我知道這個問題是有點老了,但我發現它試圖做同樣的事情時,我想我會更好的解決方案更新...

你可以在你的服務器定義多張服務。 xml,它運行在不同的端口上。服務按照它們在server.xml中出現的順序依次啓動。這意味着您可以擁有 - 例如 - 在第一個服務中運行配置服務,然後在第二個服務中運行依賴它的應用程序(我使用默認的Catalina一個用於其餘部分...)

您可以在這裏看到更多的信息: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

這是我包括服務之前卡塔利娜服務:

<Service name="ConfigService"> 
    <Connector port="8081" protocol="HTTP/1.1" 
     connectionTimeout="20000" 
     redirectPort="8444" /> 
    <Engine name="ConfigServiceEngine" defaultHost="localhost"> 
     <Host name="localhost" appBase="webapps" 
      unpackWARs="true" autoDeploy="true" 
      xmlValidation="false" xmlNamespaceAware="false"> 

      <Context path="/" reloadable="true" docBase="/path/to/your/service/directory" /> 
     </Host> 
    </Engine> 
</Service> 

正如你所看到的,我用的文檔庫,而不是的appBase,但你應該如果你願意,可以配置一個不同的appBase r ...

注意改變服務和引擎的名稱很重要。

HTH

1

這是Linux的另一個技巧。

由於錯誤的WSDL,我們的一些Web服務應用程序無法部署。如果在多個其他應用程序之後部署或啓動,則會發生這種情況。 它們的啓動順序取決於在/ opt/apache-tomee/conf/Catalina/localhost中找到上下文xml的順序。

可以使用「ls -1f」進行驗證。一個普通的「ls」給出了一個排序的輸出。

這用於將文件添加到該目錄的順序,但對於ext4文件系統,順序基於文件名的散列。

# tune2fs -O ^dir_index /dev/xyz 

現在你至少可以決定自己的次序,他們將開始:這可以如下被禁用。重新排序:將所有文件移至臨時文件夾,然後按照所需順序將其移回。