2011-12-30 28 views
13

Tôi đã phát triển một ứng dụng web đa luồng chạy trong Tomcat. Nhưng tôi không thể sử dụngChủ đề có thiết kế đặc biệt để tắt máy bởi Tomcat không?

shutdown.bat 

Tomcat không dừng lại một cách duyên dáng. Trong trình gỡ rối, tôi thấy rằng các chuỗi tiếp tục chạy sau khi lệnh tắt. Tôi có phải sửa mã ứng dụng của mình để đáp ứng các yêu cầu đặc biệt không? Cảm ơn.

Trả lời

12

... và kết hợp các phản hồi khác với hoạt động của môi trường Java Servlet;

nếu bạn không khai báo chủ đề của mình làm chủ đề daemon, cách để báo hiệu tắt máy chủ với chủ đề là triển khai ServletContextListener và định cấu hình nó cho ứng dụng web của bạn (web.xml). Khi Tomcat tắt, đầu tiên nó sẽ tắt mỗi ứng dụng, do đó sẽ gây ra phương thức contextDestroyed() của người nghe được gọi - và đây là nơi bạn có thể báo hiệu chủ đề của riêng mình rằng họ nên hoàn thành công việc của mình.

+0

Dù sao để tìm ra các chủ đề đang gây ra vấn đề này, sẽ hữu ích cho tôi, vì tôi cũng nhấn vấn đề này. – Azim

+0

Bạn có thể sử dụng kill -3, jstack hoặc tomcat thường đổ các dấu vết ngăn xếp trong catalina.out. – ticktock

6

Bất kỳ chủ đề nào vẫn đang chạy sẽ giữ cho quá trình Java (Tomcat) hoạt động. Đảm bảo tất cả các chuỗi của bạn thoát. Khi chủ đề của bạn thoát, Tomcat sẽ có thể tắt.

Xem javadoc cho Thread. Lưu ý những điều sau:

Java Virtual Machine tiếp tục thực hiện chủ đề cho đến khi một trong hai điều sau đây xảy ra:

  • Phương pháp thoát của lớp Runtime đã được gọi và quản lý bảo mật đã cho phép các hoạt động xuất cảnh để diễn ra.
  • Tất cả các chủ đề không phải là chủ đề daemon đã chết, hoặc bằng cách trả lời từ cuộc gọi đến phương thức chạy hoặc bằng cách ném một ngoại lệ lan truyền ra ngoài phương thức chạy.
+0

Bạn có thể đề xuất bất kỳ công cụ nào qua đó chúng tôi có thể kiểm tra các chủ đề này không? – Azim

5

Bạn cần phải hủy bỏ đề của bạn, tốt nhất là bằng cách gọi interrupt vào chúng và đảm bảo chúng được viết theo cách như vậy mà họ ứng phó với sự gián đoạn - ý nghĩa, kiểm tra cờ ngắt lời họ và đáp ứng một cách thông minh để InterruptedExceptions (không chỉ ăn chúng và tiếp tục).

Lời khuyên ở trên giả định bạn không muốn chủ đề của bạn bỏ những gì họ đang làm ngay lập tức. Nếu bạn ổn với điều đó thì hãy biến chúng thành daemon.

+3

Vấn đề mà tôi sử dụng thư viện phần thứ ba tạo chủ đề riêng. Và với những chủ đề này là vấn đề. – user710818

+0

@ user710818: vâng, đó là một vấn đề không tốt. Tôi hy vọng các thư viện sẽ cung cấp một số cách để bạn có thể nói với họ để làm một tắt máy duyên dáng. –

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