2012-05-22 2 views
6

Я хотел бы знать, когда изменяется свойство системы. У меня есть приложение на сервере приложений, которое каким-то образом меняет системное свойство (System.setProperty(), я думаю). Я принимал вид, и я нашел различные подходы:Как определить, изменилось ли свойство Java System?

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

Есть предложения? Заранее спасибо.

+0

Вы упомянули JMX. Вы пытаетесь обнаружить свойство за пределами вашего приложения? – Gray

+1

Вы можете попробовать работать с менеджером/политикой безопасности, который запрещает изменения и видит, где происходит «splosion». – bmargulies

+1

Зачем вам нужно знать, изменено ли свойство системы? Если вам не требуется синхронное уведомление, почему бы просто не запускать запланированный поток для периодической проверки? (Простейшая вещь, которая могла бы сработать?) –

ответ

5

Вы можете заменить системные свойства своим собственным подклассом.

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

Затем просто напишите подкласс свойств, который перехватывает соответствующие методы.

+0

Спасибо, что я! Да, я могу, вы думаете в каком-то декораторе (например, HttpServletRequestWrapper для HttpServletRequest)? Дело в том, что приложение должно вызывать мою реализацию ... – Gaucho

+1

@Gaucho - на самом деле не нужно быть декоратором. простой подкласс, который переопределяет методы, о которых вы заботитесь, - это все, что вам нужно. вам просто нужно скопировать существующие свойства системы в ваш impl. – jtahlborn

+0

mmm, интересно, и как я могу сделать, что приложение вызывает мою реализацию вместо стандартного? Благодаря! – Gaucho

1

Если вы в первую очередь хотите найти проблему, я бы посмотрел на использование SecurityManager. У него есть несколько методов checkPropertiesAccess() и checkPropertyAccess(), которые выглядят так, как будто они помогут вам найти вопрос, но не обязательно «уведомлять вас, когда системное свойство изменилось».

+0

Спасибо Николаю! Да, это была моя первая попытка: try {securityManager.checkPermission (новый PropertyPermission ("javax.xml.parsers.DocumentBuilderFactory", "write"));} catch (SecurityException securityException) {.../... Но вам нужно сначала создать диспетчера безопасности. См. Http://stackoverflow.com/questions/10624468/deny-jvm-system-property-write – Gaucho

Смежные вопросы