2012-05-22 25 views
6

Me gustaría saber cuándo se cambia una propiedad del sistema. Tengo una aplicación, en un servidor de aplicaciones, que de alguna manera está cambiando una propiedad del sistema (creo que es System.setProperty()). Estaba echando un vistazo y me he encontrado diferentes enfoques:Cómo detectar si una propiedad del Sistema Java ha cambiado?

  1. JPDA?
  2. Observer & Observable?
  3. Property change listener?
  4. JMX?

¿Alguna sugerencia? Gracias por adelantado.

+0

Usted mencionó JMX. ¿Estás tratando de detectar la propiedad desde fuera de tu aplicación? – Gray

+1

Puede intentar ejecutar con un administrador de seguridad/política que prohíbe los cambios y ver dónde ocurre la 'splosion'. – bmargulies

+1

¿Por qué necesita saber si la propiedad del sistema ha cambiado? Si no necesita una notificación sincrónica, ¿por qué no generar un hilo programado para verificar periódicamente? (¿Lo más simple que podría funcionar?) –

Respuesta

5

Puede reemplazar las Propiedades del sistema con su propia subclase personalizada.

MyProperties newProps = new MyProperties(System.getProperties()); 
System.setProperties(newProps); 

Luego, simplemente escriba una subclase de Propiedades que enganche los métodos relevantes.

+0

Gracias jtahlborn! Sí, podría, ¿estás pensando en algún tipo de decorador (como HttpServletRequestWrapper para HttpServletRequest)? Lo que ocurre es que la aplicación debe invocar mi implementación ... – Gaucho

+1

@Gaucho - realmente no necesita ser decorador. una subclase simple que anula los métodos que le interesan es todo lo que necesita. solo necesita copiar las propiedades existentes del sistema en su impl. – jtahlborn

+0

mmm, interesante, y ¿cómo puedo hacer que la aplicación invoca mi implementación en lugar de la predeterminada? ¡Gracias! – Gaucho

1

Si desea principalmente encontrar el problema, me gustaría utilizar el SecurityManager para esto. Tiene un par de métodos disponibles checkPropertiesAccess() y checkPropertyAccess() que parecen que le ayudarán a encontrar el problema, pero no necesariamente pueden 'notificarle cuando una propiedad del sistema ha cambiado.'

+0

Gracias Nicholas! Sí, ese fue mi primer intento: try {securityManager.checkPermission (new PropertyPermission ("javax.xml.parsers.DocumentBuilderFactory", "write"));} catch (SecurityException securityException) {.../... Pero necesita para crear un administrador de seguridad primero. Ver http://stackoverflow.com/questions/10624468/deny-jvm-system-property-write – Gaucho

Cuestiones relacionadas