2009-07-31 29 views
6

Có cách nào để chương trình Java phát hiện khi hệ điều hành sắp chuyển sang chế độ ngủ hay không, ít nhất là phát hiện một sự thức dậy?Phát hiện sự kiện OS Sleep and Wake Up trong Java

Vấn đề thực tế là trong một ứng dụng cụ thể, một số hoạt động cơ sở dữ liệu MySQL được chạy trong nền. Trong thử nghiệm trên một máy Windows, các giao dịch cơ sở dữ liệu này bị gián đoạn sau một chu kỳ ngủ/thức dậy gây ra một loạt các điều kiện lỗi trong chương trình. Những lỗi này thường trông giống như sau:

java.net.SocketException 
MESSAGE: Software caused connection abort: recv failed

Nếu chúng ta có thể phản ứng lại sự kiện 'sẽ ngủ sớm' chúng tôi có thể cố gắng tạm dừng hoạt động nền để tránh vấn đề. Ít lý tưởng hơn nếu chúng ta có thể phản ứng với một sự kiện 'vừa tỉnh dậy', chúng ta có thể ít nhất là loại bỏ các thông báo lỗi.

Trả lời

7

Bạn có thể phát hiện việc đánh thức bằng cách so sánh định kỳ thời gian hệ thống hiện tại với thời gian hệ thống trước đó.

Edit: đây là một ví dụ mà có vẻ như nó sẽ giúp bạn phát hiện khi máy đang đi ngủ: http://www.codeguru.com/cpp/w-p/system/messagehandling/article.php/c6907

+0

Đáng tiếc là không thể thực hiện được nếu không có JNI nhưng liên kết có vẻ như là một khởi đầu tốt. –

+0

Có, JNI có thể là một nỗi đau để phát triển và gỡ lỗi. Chúng tôi đã tìm thấy chìa khóa là giữ càng nhiều logic càng tốt trong Java, và chỉ sử dụng JNI làm cầu nối để thực hiện các cuộc gọi cấp thấp tới API C. – rob

2

Tôi biết nó không phải là chính xác những gì bạn đang tìm kiếm, nhưng có lẽ câu trả lời đúng là cố gắng viết mã với giả định rằng ổ cắm của bạn sẽ không nhất thiết phải ở lại. Có rất nhiều lý do tại sao kết nối có thể gặp sự cố, ví dụ vì DB bị gỡ xuống để bảo trì hoặc vì ai đó đã vấp phải cáp Ethernet của bạn. Tôi nghĩ rằng bạn có vấn đề tương tự với lỗi nếu ai đó rút cáp mạng trong khi ứng dụng của bạn đang chạy và đây không phải là điều kiện không mong muốn, vì vậy có thể đó là cách tiếp cận tốt hơn để thử và xử lý các điều kiện đó một cách duyên dáng.

+0

Nếu cơ sở dữ liệu gặp sự cố hoặc ai đó kéo cáp, tôi nghĩ rằng thông báo lỗi thực sự sẽ theo thứ tự! –

+0

Không nếu yêu cầu có thể phục hồi được. Đôi khi họ có, đôi khi họ không. Đôi khi nó thoáng qua, như vậy mà người dùng không bao giờ nhận thấy, nhưng bản thân hệ thống cũng vậy. Bạn sẽ có thể xử lý sự kiện đó. –

+0

Tôi đã sử dụng C3PO để thực hiện chính xác việc này, có thể xác thực các kết nối trước khi trả lại ứng dụng từ hồ bơi. –

2

Bạn chỉ có thể JNI hoặc JNA bẫy các sự kiện ngủ/đánh thức từ hệ điều hành.

Từ Windows Power Events (MSDN), bạn sẽ phải tạo trình xử lý Cửa sổ và cửa sổ rỗng để nhận các sự kiện WM_POWERBROADCAST. Thủ tục cửa sổ này sau đó có thể gọi một hàm sự kiện trong mã Java của bạn để bong bóng thông điệp lên.

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