2009-06-18 11 views
11

W przypadku komponentu J2EE ponownie używam kodu opracowanego dla aplikacji do przechwytywania java. JOptionPane.showMessageDialog() jest niestety powszechnie używany. Najczęściej na szczęście w sekcjach kodu, które nie są ponownie wykorzystywane przez aplikację J2EE, ale w niektórych przypadkach niższe poziomy kodu mają instancje JOptionPane.showMessageDialog(). Oczywiście powoduje to pojawianie się okien dialogowych na serwerze, czego właśnie chcę uniknąć.Najlepszy sposób na wykrywanie, czy kod działa na serwerze aplikacji java

Jako pierwszy krok chciałbym się upewnić, że na serwerze nie pojawią się żadne okna dialogowe.

Ktoś zasugerował, zerkając w jakiejś kolejce zdarzeń lub farby (nie pamiętam który z nich): To byłoby:

// 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! 

Nigdy naprawdę że dostał pracę. Co byś zrobił?

+0

Chciałbym zrobić to w prawidłowy sposób. Mieć interfejs z metodą 'logToUser' i przekazać jej instancję w swoim kodzie lub włożyć ją do jakiegoś statycznego pola (jeśli drugie jest niewykonalne). Gdzie się logujesz, po prostu wywołaj tę metodę. Użytkownicy kodu na serwerze będą musieli zapewnić implementację, a aplikacja Swing zapewni inną (a Android lub SWT lub inna aplikacja będzie musiała dostarczyć kolejną). Pamiętaj, aby sprawdzić wcześnie, jeśli implementacja jest ustawiona i wyrzucić wyjątek, jeśli nie ... – mihi

Odpowiedz

23

Upewnij się, że serwer jest uruchamiany z

java -Djava.awt.headless=true 

większości serwerów należy rozpocząć w ten sposób domyślnie. Następnie można sprawdzić:

boolean headless_check = GraphicsEnvironment.isHeadless(); 

Więcej szczegółów na temat dostępnych bez głowy here:

+0

Lub dowolny niestandardowy parametr systemowy, na przykład -Dnodialog = true. – akarnokd

+0

Dobry punkt. Istnieje wiele właściwości systemu, które byłyby unikalne dla każdego środowiska. W przypadku serwera aplikacji Oracle OC4J: System.getProperty ("oracle.oc4j.instancename"); –

+0

Nie chodzi o właściwości zależne od systemu. Możesz użyć czegokolwiek chcesz: -Dthis_is_a_param_for_no_dialog = true – akarnokd

0

Właśnie przetestowane z OpenJDK Runtime Environment (IcedTea 2.4.3) (Gentoo budować 1.7.0_45-B31) w systemie Linux, a Uważam, że unset DISPLAY było również wystarczające, aby isHeadless() (i isHeadlessInstance()) zwróciło true.

Ta metoda nie tylko informuje, czy AWT był zmuszony ignorować możliwości graficzne systemu, ale raczej czy proces ma dostęp do możliwości graficznych.

Przykład:
Kod działa na jakimś polu, który nie ma karty graficznej (to prawdopodobnie co chcesz wiedzieć), dzięki czemu można zawsze sprawdzić właściwość systemu, jeśli z jakiegoś powodu chcesz wiedzieć, czy tryb bezgłowe został wymuszony.

Powiązane problemy