2012-01-09 31 views
8

Tôi biết rằng Tomcat và thông số Servlet do not support starting webapps in a particular order.Tomcat - bắt đầu ứng dụng web theo thứ tự cụ thể

Tuy nhiên, điều này dường như giống như trường hợp sử dụng phổ biến và tôi tự hỏi liệu có ai đó đã phát hiện ra cách giải quyết thông minh cho nó hay không.

Tôi có webapp A sử dụng Spring Remoting để hiển thị dịch vụ được chia sẻ, trong đó webapp B là ứng dụng khách. Webapp B không thể khởi tạo trừ khi webapp A đang chạy. Tuy nhiên, Tomcat của tôi luôn khởi động ứng dụng web một cách tuyến tính, bắt đầu bằng webapp B.

Vì lý do cơ sở hạ tầng, tôi phải chạy các ứng dụng này trên cùng một máy chủ Tomcat.

Bất kỳ ý tưởng nào?

Cảm ơn, Roy

CẬP NHẬT -

Hóa ra rằng trong trường hợp đặc biệt của tôi, trật tự không quan trọng. Lý do là: nói rằng tôi sử dụng một trong những phương pháp dưới đây để bắt đầu ứng dụng A trước khi ứng dụng B. Vì vậy, ứng dụng A bắt đầu, nhưng, vì Spring remoting đang sử dụng HTTP Invoker, cổng HTTP chưa được mở (nó sẽ không mở cho đến khi tất cả ứng dụng được bắt đầu). Vì vậy, A sẽ bắt đầu, và B sẽ treo, bởi vì cổng mà nó đang tìm kiếm chưa có sẵn. Doh.

Kết quả cuối cùng là hai phiên bản Tomcat riêng biệt.

+0

Yêu cầu ứng dụng web cần đợi ứng dụng web khác chờ đợi thay vì thất bại và bỏ cuộc. –

+1

Xin chào Dave, unf. chúng không bắt đầu song song .. B bắt đầu (tốt, cố gắng bắt đầu) và sau đó A sẽ bắt đầu sau đó. Nhưng nếu B không thể khởi động được vì nó không thể kết nối với A, A không bao giờ cố gắng bắt đầu. –

+1

Nó sẽ bắt đầu chúng theo thứ tự ASCII. Một mẹo mà tôi thấy trên các cài đặt Debian Apache là tạo ra một quy ước đặt tên 000_default, 001_default. Điều đó làm cho nó rõ ràng hơn một chút khi xem thứ tự ASCII của danh sách dir. – speeves

Trả lời

3

Chúng tôi có cùng một vấn đề và giải quyết chúng tôi đang dựa vào thực tế (trơn, tôi biết) rằng các ứng dụng được bắt đầu theo thứ tự chúng được xác định trong <tomcat_home>/conf/server.xml.

Điều này tất nhiên có một bất lợi của các ứng dụng mã hóa trong server.xml nhưng chúng tôi có thể sống với nó.

+0

Cảm ơn mindas - Đây có lẽ là cách tốt nhất để làm điều đó nhưng unf không làm việc cho tôi - Tôi sẽ chỉnh sửa câu hỏi của tôi để giải thích tại sao. –

1

Về lý thuyết, bạn có thể sinh ra một số Runnable theo số ExecutorService trong contextInitialized() để kiểm tra tính khả dụng của webapp khác trong khoảng thời gian (có thể bằng cách yêu cầu HTTP HEAD?). Khi webapp khác có sẵn, sau đó đặt một số thuộc tính trong ngữ cảnh servlet cho biết điều đó. Thêm Filter để kiểm tra sự hiện diện của thuộc tính đó và chặn/tiếp tục yêu cầu cho phù hợp.

0

Đây là mẹo hay mà tôi sử dụng để tạo 2 cấp tải webapp. ở mỗi cấp, thứ tự không được bảo đảm. Điều này dựa trên thực tế là tomcat sẽ tải các mô tả ngữ cảnh đầu tiên từ tomcat/conf/[Tên máy]/[Tên máy chủ] và chỉ sau đó ngữ cảnh từ thuộc tính appBase của phần tử Máy chủ trong server.xml

Chỉ cần thêm các mục sau đang ở đâu đó trong webapp bạn muốn tải ở mức thứ 2 (tức là sau)

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

Đó là khá dễ dàng để đạt được nếu bạn không quan tâm hack một chút mã tomcat và tạo chủ dụ của riêng bạn

1) Tạo một subClass của org.apache.catalina.core.StandardHost, nói myhost:

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

2) đăng ký lớp học của bạn trên thẻ xml chủ của máy chủ của bạn()

Incredible như nó có vẻ, nó giải quyết vấn đề miễn là bạn có tất cả ứng dụng web của bạn khai báo trong thứ tự chính xác bên trong thẻ Máy chủ:

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

Ứng dụng Tha1 sẽ bắt đầu trước app2, bất kể bạn sử dụng SO nào.

+1

Sau bước đầu tiên, chúng ta nên đặt lớp MyHost ở đâu? Bạn có thể vui lòng xây dựng thêm. – abi1964

+0

chúng ta có thể có ví dụ về cấu hình máy chủ –

1

Tôi biết câu hỏi này là một chút cũ, nhưng tôi tìm thấy nó khi cố gắng làm điều tương tự và nghĩ rằng tôi muốn cập nhật với một giải pháp tốt hơn ...

Bạn có thể xác định các dịch vụ mulitple trong máy chủ của bạn. xml, chạy trên các cổng khác nhau. Các dịch vụ được bắt đầu tuần tự theo thứ tự chúng xuất hiện trong tệp tin server.xml. Điều này có nghĩa là bạn có thể có - ví dụ - một dịch vụ cấu hình chạy trong dịch vụ đầu tiên và sau đó các ứng dụng phụ thuộc vào nó trong lần thứ hai (tôi sử dụng một Catalina mặc định cho phần còn lại của chúng ...)

Bạn có thể xem thêm thông tin ở đây: http://wiki.apache.org/tomcat/FAQ/Miscellaneous#Q27

Và đây là dịch vụ mà tôi bao gồm trước Sở Catalina:

<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> 

Như bạn thấy, tôi sử dụng docbase hơn appBase, nhưng bạn nên có thể định cấu hình một appBase khác nếu bạn bắt đầu r ...

NB điều quan trọng là phải đổi tên của cả dịch vụ và động cơ.

HTH

1

Đây là một mẹo khác trên Linux.

Một số ứng dụng webservice của chúng tôi không triển khai được do WSDL sai. Điều này xảy ra nếu chúng được triển khai hoặc bắt đầu sau một số ứng dụng khác. Thứ tự mà chúng bắt đầu phụ thuộc vào thứ tự mà trong đó ngữ cảnh xml được tìm thấy trong/opt/apache-tomee/conf/Catalina/localhost

Có thể được xác minh bằng cách sử dụng "ls -1f". Một "ls" đơn giản cho một kết quả được sắp xếp.

Đây thường là thứ tự các tệp được thêm vào thư mục đó, nhưng với hệ thống tệp ext4, thứ tự dựa trên giá trị băm của tên tệp. Điều này có thể bị vô hiệu hóa như sau:

# tune2fs -O ^dir_index /dev/xyz 

Bây giờ bạn có thể ít nhất tự quyết định thứ tự chúng sẽ bắt đầu. Sắp xếp lại: di chuyển tất cả các tệp vào một thư mục tạm thời, di chuyển chúng trở lại theo trình tự mong muốn.

Các vấn đề liên quan