2009-06-18 14 views
11

Para un bean J2EE estoy reutilizando el código que fue desarrollado para una aplicación java swing. JOptionPane.showMessageDialog() desafortunadamente se usa comúnmente. La mayoría de las veces ocurren afortunadamente en secciones de código que no son reutilizadas por la aplicación J2EE, pero en algunos casos los niveles más bajos del código tienen instancias de JOptionPane.showMessageDialog(). Obviamente, esto da como resultado que aparezcan cuadros de diálogo en el servidor, que es lo que quiero evitar.La mejor manera de detectar si el código se está ejecutando en un servidor de aplicaciones java

Como primer paso, me gustaría de alguna manera asegurar que nunca se producirán cuadros de diálogo en el servidor.

Alguien sugirió que mira a escondidas en alguna cola de eventos o pintura (no recuerdo cuál): Eso sería:

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

Nunca realmente tiene que trabajar. ¿Qué harías?

+0

Intentaré hacerlo de la manera correcta. Tener una interfaz con un método 'logToUser', y pasar una instancia de ello en su código o meterlo en algún campo estático (si el otro es inviable). Donde se registra, simplemente llame a ese método. Los usuarios del código en el servidor deberán proporcionar una implementación, y la aplicación Swing proporcionará otra (y una aplicación Android u SWT u otra tendrá que proporcionar otra más). Asegúrese de verificar anticipadamente si la implementación está configurada y lanzar una excepción si no ... – mihi

Respuesta

23

Asegúrese de que el servidor se inicia con

java -Djava.awt.headless=true 

mayoría de los servidores se debe iniciar de ese modo por defecto. A continuación, puede comprobar:

boolean headless_check = GraphicsEnvironment.isHeadless(); 

Más detalles sobre decapitado disponibles here:

+0

O cualquier parámetro personalizado del sistema, por ejemplo -Dnodialog = verdadero. – akarnokd

+0

Buen punto. Hay una plétora de propiedades del sistema que serían exclusivas de cada entorno. Para la aplicación Oracle OC4J Servidor: System.getProperty ("oracle.oc4j.nombre de la instancia"); –

+0

No se trata de propiedades dependientes del sistema. Puede usar cualquier cosa que desee: -Dthis_is_a_param_for_no_dialog = true – akarnokd

0

Acabo de probar esto con OpenJDK Runtime Environment (IcedTea 2.4.3) (Gentoo construir 1.7.0_45-b31) en Linux, y Encuentro que unset DISPLAY también fue suficiente para hacer que isHeadless() (y isHeadlessInstance()) devuelvan true.

Por lo tanto, este método no solo indica si AWT se vio obligado a ignorar las capacidades gráficas del sistema, sino más bien si su proceso tiene acceso a capacidades gráficas.

Ejemplo:
El código se ejecuta en alguna caja que no tiene una tarjeta de visualización (eso es probablemente lo que usted quiere saber) por lo que siempre se puede comprobar la propiedad del sistema si por alguna razón usted quiere saber si el modo sin cabeza fue forzado.

Cuestiones relacionadas