2012-12-18 28 views
8

Tôi có một lớp thực hiện ServletContextListener tải một số tài nguyên khi khởi động.Làm thế nào để hủy bỏ Tomcat khởi động khi ngoại lệ trong ServletContextListener?

Các tài nguyên đó rất quan trọng đối với ứng dụng theo cách mà tôi muốn không khởi động toàn bộ khi một số sự kiện xấu xảy ra trong logic của tôi.

Có lệnh nào tôi có thể thực hiện từ bên trong phương thức ServletContextListener.contextInitialized() để dừng và không khởi động được toàn bộ Tomcat không?

+0

Có ai tìm thấy bất kỳ cách nào khác hơn System.exit (1)? – Bastien

+0

@Bastien, sử dụng SpringBoot –

+2

@Leo không liên quan. Câu trả lời đúng cho câu hỏi sẽ là giải thích về cách SpringBoot quản lý vấn đề này. – Bastien

Trả lời

11

Cố gắng xác định:

-Dorg.apache.catalina.startup.EXIT_ON_INIT_FAILURE=true 

trong java tùy chọn thời gian chạy của bạn, trích dẫn official documentation:

Nếu đúng, các máy chủ sẽ thoát nếu một ngoại lệ xảy ra trong giai đoạn máy chủ khởi tạo.

Nếu không được chỉ định, giá trị mặc định của sai sẽ được sử dụng.

UPDATE:

Nếu bạn muốn làm điều này bằng mã, sẽ System.exit() làm việc?

public class FailFastListener implements ServletContextListener { 

    private static final Logger log = LoggerFactory.getLogger(FailFastListener.class); 

    @Override 
    public void contextInitialized(ServletContextEvent servletContextEvent) { 
     try { 
      //initialization 
     } catch(Exception e) { 
      log.error("Sooo bad, shutting down", e); 
      System.exit(1); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent servletContextEvent) { 
    } 
} 

Bạn có thể sử dụng mẫu để kết nối người nghe hiện tại mà không làm lộn xộn chúng. Không chắc chắn Tomcat sẽ phản ứng như thế nào ...

+0

Cảm ơn, điều đó gần như giải quyết được vấn đề của tôi, nhưng ... Tôi đang tìm cách thực hiện nó bằng cách thực thi mã. Nếu không thể - tôi sẽ sử dụng lựa chọn thời gian chạy. – urir

+1

@urir: xem cập nhật của tôi –

+0

Yep :) System.exit huyền diệu (1) :) Tôi biết, tôi nên đặt câu hỏi cho tôi một cách rõ ràng hơn ... vì vậy ... Bất kỳ cách nào để thực hiện việc này thông qua truy xuất thùng chứa Tomcat ? Lý do chính khiến tôi sợ rằng System.exit sẽ không đóng các sự kiện khác trong vòng đời, chẳng hạn như những người khác phá hủy 'mã' ... Bạn nghĩ gì về điều đó? – urir

0

Nếu bạn muốn dừng Tomcat vì webapp của bạn không triển khai được, tôi cho rằng bạn không triển khai ứng dụng khác cho tomcat. Trong trường hợp đó, tại sao bạn không xây dựng ứng dụng này như một ứng dụng web độc lập với Tomcat/Jetty được nhúng? Bằng cách này, miễn là ứng dụng web của bạn không khởi động đúng cách, máy chủ nhúng cũng sẽ tắt.

Với tôi, có vẻ như bạn đang tập trung vào ServletContextListener để giải quyết vấn đề không phải là nội dung của ServletContextListener.

Không sử dụng System.exit() vì nó sẽ giết máy chủ có thể tôi chạy các ứng dụng được triển khai khác. Nếu nó là ok vì bạn biết sẽ không bao giờ có các ứng dụng khác (và bạn không muốn), sau đó tạo một webapp độc lập. Thực tiễn không tốt này được liệt kê trong CWE như một điểm yếu tiềm năng: CWE-382

Chỉ cần gợi ý: khởi động mùa xuân tạo điều kiện cho nỗ lực xây dựng một ứng dụng web độc lập với máy chủ nhúng. Xem hướng dẫn này: https://spring.io/guides/gs/spring-boot/

tốt bài báo giải thích lý do tại sao điều này có lẽ những gì bạn đang tìm kiếm: http://www.beyondjava.net/blog/application-servers-sort-of-dead/

+0

downvoter ... bạn có thể hãy giải thích tại sao? –

+0

Hi downvoter, làm thế nào về điều này? http://cwe.mitre.org/data/definitions/382.html –

+1

Tôi upvoted bạn như bạn nói chung là chính xác tuy nhiên Tomcat là loại một trường hợp đặc biệt bởi vì tomcat nhúng không phải luôn luôn thực sự nhúng ... đó là nhiều classloaders vẫn được sử dụng. Ví dụ, plugin Tomcat Maven sẽ biến một WAR thành một JAR thực thi ** nhưng ** nó thực sự đang chạy rất giống với Tomcat bình thường. Spring Boot không làm điều này vì nó là cha mẹ và Tomcat chạy trong cùng một trình nạp lớp. Có thực sự là một lợi ích của việc có nhiều classloader (cách tomcat maven plugin) như bạn có thể tránh các vấn đề với Tomcats lọ (chẳng hạn như sự lựa chọn của nó trong việc ghi nhật ký). –

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