2010-01-04 45 views
14

Tôi đang xây dựng một ứng dụng web tương đối đơn giản, nơi servlet chính triển khai giao diện ServletContextListener để xác định xem ngữ cảnh đã được bắt đầu hay chưa. Tôi đã triển khai các phương thức contextInitialized, contextDestroyed, initdestroy (cả hai initdestroy gọi super trên lớp cơ sở). Tôi hiện đang triển khai không có chức năng thực sự nào khác ngoài việc tôi đã khởi tạo log4j trong phương thức contextInitialized nơi tôi tải tệp log4j.properties.Tomcat không tắt trong Eclipse

Khi tôi khởi động và dừng máy chủ Tomcat từ bên trong Eclipse, mọi thứ được gọi theo thứ tự đúng (tôi đang sử dụng một số System.out.println để kiểm tra điều này) nhưng sau khoảng 10 giây dừng máy chủ với cửa sổ bật lên Eclipse nêu rõ các điều sau:

Máy chủ Tomcat v6.0 Máy chủ tại localhost không phản hồi. Bạn có muốn chấm dứt máy chủ này không? Nhấp OK để chấm dứt máy chủ hoặc nhấp vào Hủy để tiếp tục chờ.

này được những gì đang in trong giao diện điều khiển Eclipse của tôi khi tôi dừng máy chủ:

04/01/2010 7:39:13 PM org.apache.catalina.core.StandardService dừng
INFO : dịch vụ Dừng Catalina
contextDestroyed
04/01/2010 19:39:13 org.apache.coyote.http11.Http11Protocol phá hủy
INFO: Dừng Coyote hTTP/1.1 trên http-8080

Và sau thông báo INFO cuối cùng, nó chỉ treo ở đó cho đến khi cửa sổ bật lên xuất hiện. Nếu tôi chọn chờ, nhấn Cancel, Eclipse sẽ không sử dụng được và tôi phải giết quá trình Eclipse từ một thiết bị đầu cuối.

Mọi thông tin đầu vào về cách giải quyết vấn đề này sẽ được đánh giá rất nhiều.

UPDATE:

vấn đề này được gây ra bởi một sợi phi-daemon mà tôi bắt đầu trong phương pháp init tôi (quên đề cập đến :) đó. Vấn đề đã được giải quyết bằng cách ngăn chặn một cách rõ ràng luồng với phương thức stop, mặc dù phương thức đó dường như không còn được dùng nữa.

+0

Tôi thực sự là người đầu tiên sử dụng thẻ 'servlet'?!? – Luke

+0

'servlets' là thẻ phổ biến hơn, có vẻ như. :) – ZoogieZork

+0

Tôi nghĩ rằng điều này xảy ra không chỉ trong nhật thực, nhưng nói chung. Theo như tôi nhớ lại đó là một vấn đề với nguồn tài nguyên log4j, google với ý nghĩ đó. – Bozho

Trả lời

5

Như đã đề cập trong this thread, điều này phải liên quan đến vấn đề dọn dẹp.

Nếu một ứng dụng web không dọn dẹp hoàn toàn, đặc biệt là đối với dừng các chuỗi không phải daemon, khởi động, Tomcat sẽ không tắt được.
Nhấp vào "Dừng" có lợi thế là cung cấp thời gian chờ.
Nếu Tomcat không dừng trong thời gian chờ, một hộp thoại sẽ xuất hiện cho bạn tùy chọn chấm dứt máy chủ hoặc tiếp tục chờ.

+0

Câu trả lời của bạn đã được bật lên. Tôi đã thêm bản cập nhật cho câu hỏi của mình giải thích giải pháp. Cảm ơn! – Luke

+1

cũng cho tôi ngay cả khi thời gian chờ xảy ra và tôi nhận được một hộp thoại, tôi đã bấm Tomcat để đóng, ngay cả khi nó không đóng. Vì vậy, tôi vẫn đang đợi máy chủ Tomcat đóng lại. Tôi biết tôi có thể trực tiếp đi và giết các deamon, nhưng lực lượng tắt máy (sau khi hết thời gian) nên tắt máy chủ quá. – user590849

0

Tôi đã có một hành vi tương tự. Nếu đóng Tomcat không giúp tìm một console đang hoạt động khác từ giao diện điều khiển và giết nó. Trong trường hợp của tôi nó giúp.

+2

Nó không phải là tôi không thể giết/ngăn chặn nó. Tôi muốn nó tắt máy đúng cách mà không cần tôi bắn nó qua đầu. – Luke

0

Trên Windows, mở Trình quản lý tác vụ và hủy quá trình javaw.

0

Trên Mac OS X, sử dụng Trình giám sát hoạt động, buộc thoát khỏi quá trình GrailsStarter.

6

Mở Command Prompt hoặc PowerShell trong các cửa sổ và gõ

netstat -nao 

tìm pid của tương ứng cổng từ kết quả và gõ

taskkill /f /pid [port number] 
0

Tôi đã nhìn vào bản cập nhật của bạn mà giải quyết vấn đề của bạn cũng , đối với tất cả những người xem khác của câu hỏi này, tôi muốn đưa ra cách tiếp cận tốt hơn.

Thay vì sử dụng stop u nên gọi ngắt trên chuỗi và mã bọc của phương thức chạy trong trong khi vòng lặp kiểm tra! IsInterrupted(), bất cứ khi nào ngắt được gọi là chuỗi sẽ thoát ra khỏi vòng lặp và phương thức chạy sẽ hoàn tất quá trình xử lý của nó . Giống như ví dụ dưới đây từ tôi khác answer

class Consumer implements Runnable{ 
    private BlockingQueue<Message> blockingQueue; 
    Consumer(BlockingQueue<Message> blockingQueue){ 
     this.blockingQueue=blockingQueue; 
    } 

    @Override 
    public void run(){ 
     while(!Thread.interrupted()){ 
      System.out.print("Concumer Started"); 
      try{ 
       Message message = blockingQueue.take(); 
       System.out.print("message Id"+message.messageId+" Consumed "); 
      } 
      catch(InterruptedException e){ 
       e.printStackTrace(); 
      } 
      System.out.println("Concumer Done"); 
     } 
    } 
} 
1

Ví dụ:

taskkill /pid 1230 /pid 1241 /pid 1253 
taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe 
taskkill /s srvmain /f /im notepad.exe 
taskkill /s srvmain /u maindom\hiropln /p [email protected] /fi "IMAGENAME eq note*" /im * 
taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im * 
taskkill /f /fi "PID ge 1000" /im * 

Vui lòng sử dụng liên kết này https://technet.microsoft.com/en-us/library/bb491009.aspx

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