2009-06-18 16 views
11

Für eine J2EE-Bean verwende ich Code, der für eine Java-Swing-Anwendung entwickelt wurde. JOptionPane.showMessageDialog() wird leider häufig verwendet. Die meisten Vorkommen sind glücklicherweise in Code-Abschnitten, die nicht von der J2EE-Anwendung wiederverwendet werden, aber in einigen Fällen haben niedrigere Code-Ebenen Instanzen von JOptionPane.showMessageDialog(). Offensichtlich führt dies dazu, dass Dialogfelder auf dem Server erscheinen, was ich vermeiden möchte.Die beste Methode, um zu erkennen, ob Code in einem Anwendungsserver ausgeführt wird. Java

Als ersten Schritt möchte ich irgendwie sicherstellen, dass keine Dialogfelder auf dem Server jemals auftreten werden.

Jemand schlug vor, in einem Ereignis oder Farbe Warteschlange späht (Ich erinnere mich nicht, welche): das wäre:

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

ich nie wirklich bekam, dass die Arbeit. Was würden Sie tun?

+0

Ich würde versuchen, es richtig zu machen. Haben Sie eine Schnittstelle mit einer Methode 'logToUser', und übergeben Sie entweder eine Instanz davon in Ihrem Code oder stecken Sie sie in ein statisches Feld (wenn das andere nicht durchführbar ist). Wenn Sie sich anmelden, rufen Sie einfach diese Methode auf. Die Benutzer des Codes auf dem Server müssen eine Implementierung bereitstellen, und die Swing-Anwendung muss eine andere bereitstellen (und eine Android- oder SWT-Anwendung oder eine andere Anwendung muss noch eine andere bereitstellen). Stellen Sie sicher, dass Sie früh überprüfen, ob die Implementierung aktiviert ist, und eine Ausnahme auslösen, wenn nicht ... – mihi

Antwort

23

Sicherstellen, dass der Server mit gestartet

java -Djava.awt.headless=true 

Die meisten Server sollten auf diese Weise standardmäßig gestartet werden. Dann können Sie überprüfen:

boolean headless_check = GraphicsEnvironment.isHeadless(); 

Weitere Details zu kopflos verfügbar here:

+0

Oder ein benutzerdefinierter Systemparameter, zum Beispiel -Dnodialog = true. – akarnokd

+0

Guter Punkt. Es gibt eine Fülle von Systemeigenschaften, die für jede Umgebung einzigartig sind. Für Oracle OC4J-Anwendung Server: System.getProperty ("oracle.oc4j.instancename"); –

+0

Es handelt sich nicht um systemabhängige Eigenschaften. Sie können alles verwenden, was Sie wollen: -Dhis_is_a_param_for_no_dialog = true – akarnokd

0

ich dies nur getestet mit OpenJDK Runtime Environment (IcedTea 2.4.3) (Gentoo bauen 1.7.0_45-b31) auf Linux, und Ich finde, dass unset DISPLAY war auch ausreichend, isHeadless() (und isHeadlessInstance()) Rückkehr true.

So sagt Ihnen diese Methode nicht nur, ob AWT gezwungen war, die Grafikfähigkeiten des Systems zu ignorieren, sondern ob Ihr Prozess überhaupt Zugriff auf Grafikfähigkeiten hat.

Beispiel:
Der Code auf einige Feld ausgeführt wird, die keine Grafikkarte hat (das ist wahrscheinlich, was Sie wissen wollen), so können Sie immer die Systemeigenschaft überprüfen, ob Sie aus irgendeinem Grund, ob Headless Modus wissen wollen war gezwungen.

Verwandte Themen