2009-09-11 47 views
15

Tôi có một ứng dụng độc lập, trong đó tôi phải nhắc người dùng bằng một hộp thoại xác nhận để lưu các thay đổi do anh ta thực hiện khi anh ta cố gắng tắt hệ thống bằng start-->shutdown.Xử lý tín hiệu bằng "TERM"

Tôi biết rằng bằng cách sử dụng signalhandlers, chúng tôi có thể thực hiện.
một ai có thể giúp tôi làm thế nào để sử dụng bộ xử lý tín hiệu

+1

Làm thế nào để đối phó với câu hỏi SIGINT: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –

Trả lời

33

Cập nhật tháng năm 2012 (2 năm rưỡi sau)

Trejkaz nhận xét:

Trong các phiên bản hiện tại của mã Java xử lý tín hiệu này không thành công vì tín hiệu "INT" được đặt trước bởi máy ảo hoặc hệ điều hành ".
Ngoài ra, không có tên tín hiệu hợp lệ nào thực sự kích hoạt khi có yêu cầu đóng ứng dụng (tôi chỉ kiểm tra cẩn thận tất cả những gì tôi có thể tìm hiểu ...)
Móc tắt hoạt động chủ yếu nhưng chúng tôi thấy rằng trường hợp của chúng tôi nó không được sa thải, vì vậy bước tiếp theo rõ ràng là phải nghỉ mát để đăng ký một handler đằng sau của JVM lại

chương "Integrating Signal and Exception Handling" của "Troubleshooting Guide for HotSpot VM" đề cập đến các tín hiệu "SIGTERM, SIGINT, SIGHUP" chỉ dành cho Solaris OS và Linux.
Chỉ xử lý ngoại lệ trên Windows được đề cập.

câu trả lời

gốc (tháng 9 năm 2009)

một ShutdownHook nên có thể xử lý rằng trường hợp

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     // what you want to do 
    } 
})); 

(với caveats)
Xem thêm:

như một minh hoạ của xử lý tín hiệu đơn giản:

public class Aaarggh { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
     System.out.println(
      "Aaarggh, a user is trying to interrupt me!!"); 
     System.out.println(
      "(throw garlic at user, say `shoo, go away')"); 
     } 
    }); 
    for(int i=0; i<100; i++) { 
     Thread.sleep(1000); 
     System.out.print('.'); 
    } 
    } 
} 
+0

Cool - nhưng điều đó dựa vào cây sun.misc. *, hiện không còn được dùng nữa. Và gợi ý cho lớp hiện tại chúng ta nên sử dụng là gì? – zigdon

+0

@zigdon: Không chắc chắn, thực sự. Các lớp đó vẫn có trong jdk hoặc openjdk, http://www.docjar.com/docs/api/sun/misc/SignalHandler.html và mặc dù chúng không phải là một phần của giao diện công cộng được hỗ trợ (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html), nhưng các giải pháp khác có thể liên quan đến JVMTI hoặc JMX (http://stackoverflow.com/questions/5023520/sending-signals-to-a -running-jvm) – VonC

+1

Trên các phiên bản Java hiện tại, mã xử lý tín hiệu này không thành công vì tín hiệu "INT" được "đặt trước bởi VM hoặc hệ điều hành". Ngoài ra, không có tên tín hiệu hợp lệ nào khác thực sự kích hoạt khi một cái gì đó yêu cầu ứng dụng đóng lại (tôi chỉ kiểm tra cẩn thận tất cả những cái tôi có thể tìm hiểu ...) Móc tắt máy chủ yếu hoạt động nhưng chúng tôi thấy rằng trong trường hợp của chúng tôi nó không phải là bắn, vì vậy bước tiếp theo rõ ràng là để nghỉ mát để đăng ký một xử lý phía sau lưng của JVM. :) – Trejkaz

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