2012-05-22 19 views
6

Ich würde gerne wissen, wenn eine Systemeigenschaft geändert wird. Ich habe eine Anwendung in einem Anwendungsserver, die irgendwie eine Systemeigenschaft ändert (System.setProperty() ich denke). Ich war ein Blick, und ich habe verschiedene Ansätze gefunden:Wie erkennt man, ob sich eine Java-Systemeigenschaft geändert hat?

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

Irgendwelche Vorschläge? Danke im Voraus.

+0

Sie erwähnten JMX. Versuchen Sie, die Eigenschaft von außerhalb Ihrer Anwendung zu erkennen? – Gray

+1

Sie können versuchen, mit einem Sicherheitsmanager/einer Sicherheitsrichtlinie zu arbeiten, die Änderungen verbietet und sieht, wo die Splosion stattfindet. – bmargulies

+1

Warum müssen Sie wissen, ob die Systemeigenschaft geändert wird? Wenn Sie keine synchrone Benachrichtigung benötigen, spawnen Sie einen geplanten Thread regelmäßig zur Überprüfung. (Die einfachste Sache, die könnte funktionieren?) –

Antwort

5

Sie können die Systemeigenschaften durch Ihre eigene benutzerdefinierte Unterklasse ersetzen.

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

Dann schreiben Sie einfach eine Unterklasse von Eigenschaften, die die relevanten Methoden hakt.

+0

Danke jtahlborn! Ja, könnte ich, denken Sie in einer Art Dekorateur (wie der HttpServletRequestWrapper für die HttpServletRequest)? Die Sache ist, dass die Anwendung meine Implementierung aufrufen sollte ... – Gaucho

+1

@Gaucho - es muss nicht wirklich Dekorateur sein. Eine einfache Unterklasse, die die Methoden überschreibt, die Ihnen wichtig sind, ist alles was Sie brauchen. Sie müssen nur die vorhandenen Systemeigenschaften in Ihr Impl kopieren. – jtahlborn

+0

mmm, interessant, und wie kann ich machen, dass die Anwendung ruft meine Implementierung statt der Standard? Vielen Dank! – Gaucho

1

Wenn Sie in erster Linie das Problem finden möchten, würde ich mit der SecurityManager dafür aussehen. Es hat ein paar Methoden zur Verfügung checkPropertiesAccess() und checkPropertyAccess(), die aussehen, als wären sie Sie finden das Problem helfen, aber nicht unbedingt der Lage sein ‚Sie benachrichtigt werden, wenn eine Systemeigenschaft verändert hat.‘

+0

Danke Nicholas! Ja, das war mein erster Versuch: try {securityManager.checkPermission (neue PropertyPermission ("javax.xml.parsers.DocumentBuilderFactory", "write"));} catch (SecurityException securityException) {.../... Aber du brauchst um zuerst einen Sicherheitsmanager zu erstellen. Siehe http://stackoverflow.com/questions/10624468/deny-jvm-system-property-write – Gaucho

Verwandte Themen