2009-06-18 26 views
11

Đối với một bean J2EE Tôi đang sử dụng lại mã được phát triển cho một ứng dụng java swing. JOptionPane.showMessageDialog() là tiếc là thường được sử dụng. Hầu hết các lần xuất hiện may mắn trong các phần mã không được ứng dụng J2EE sử dụng lại, nhưng trong một số trường hợp, các mức mã thấp hơn có các cá thể của JOptionPane.showMessageDialog(). Rõ ràng điều này dẫn đến các hộp thoại xuất hiện trên máy chủ, đó là những gì tôi muốn tránh.Cách tốt nhất để phát hiện xem mã lệnh chạy trong một máy chủ ứng dụng java

Là một bước đầu tiên tôi muốn bằng cách nào đó đảm bảo rằng không có hộp thoại sẽ bao giờ xảy ra trên máy chủ.

Có người đề nghị nhìn trộm trong một số sự kiện hoặc sơn hàng đợi (tôi không nhớ cái nào): Đó sẽ là:

// old code: JOptionPane.showMessageDialog(msg); 
if (someEventQueue.size() == 0) // <== consider this pseudo-code 
    Log.log(msg); // I am running on a server. Tell the log. 
else 
    JOptionPane.showMessageDialog(msg); // I have a user made of meat. Tell him! 

Tôi chưa bao giờ thực sự nhận rằng làm việc. Bạn sẽ làm gì?

+0

Tôi sẽ cố gắng làm điều đó một cách chính xác. Có một giao diện với một phương thức 'logToUser', và có thể truyền một thể hiện của nó xung quanh trong mã của bạn hoặc đưa nó vào một số trường tĩnh (nếu trường khác là không khả thi). Nơi bạn đăng nhập, chỉ cần gọi phương thức đó. Người dùng mã trên máy chủ sẽ phải cung cấp triển khai và ứng dụng Swing cung cấp một mã khác (và Android hoặc SWT hoặc ứng dụng khác sẽ phải cung cấp một ứng dụng khác). Đảm bảo kiểm tra sớm nếu cài đặt được thực hiện và ném ngoại lệ nếu không ... – mihi

Trả lời

23

Hãy chắc chắn rằng máy chủ được bắt đầu với

java -Djava.awt.headless=true 

Hầu hết các máy chủ nên được bắt đầu cách mà theo mặc định. Sau đó, bạn có thể kiểm tra:

boolean headless_check = GraphicsEnvironment.isHeadless(); 

Thông tin chi tiết trên không đầu sẵn here:

+0

Hoặc bất kỳ thông số hệ thống tùy chỉnh nào, ví dụ -Dnodialog = true. – akarnokd

+0

Điểm tốt. Có rất nhiều thuộc tính hệ thống sẽ là duy nhất cho mỗi môi trường. Đối với ứng dụng Oracle OC4J Server: System.getProperty ("oracle.oc4j.instancename"); –

+0

Các thuộc tính không phụ thuộc vào hệ thống của nó. Bạn có thể sử dụng bất cứ điều gì bạn muốn: -Dthis_is_a_param_for_no_dialog = true – akarnokd

0

tôi chỉ thử nghiệm này với OpenJDK Runtime Environment (IcedTea 2.4.3) (Gentoo xây dựng 1.7.0_45-B31) trên Linux, và tôi thấy rằng unset DISPLAY cũng là đủ để làm cho isHeadless() (và isHeadlessInstance()) trở true.

Vì vậy, phương pháp này không chỉ cho bạn biết liệu AWT đã buộc phải bỏ qua khả năng đồ họa của hệ thống, nhưng thay vì cho dù quá trình của bạn có quyền truy cập vào khả năng đồ họa gì cả.

Ví dụ:
Mã này được chạy trên một số hộp mà không có card màn hình (đó có thể là những gì bạn muốn biết) vì vậy bạn luôn có thể kiểm tra tài sản hệ thống nếu vì một lý do bạn muốn biết liệu chế độ không đầu là buộc.

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