Использование системных свойств в Java - PullRequest
2 голосов
/ 28 августа 2009

У меня есть вопрос об использовании свойств системы в Java. Некоторые классы, такие как Authenticator, требуют, чтобы мы установили системные свойства, относящиеся к настройкам прокси, и затем проверили, был ли прокси действительным или нет.

У меня вопрос: нужно ли мне удалять Set Properties после того, как я его использую?

Существуют другие части программ, которые могут использовать эти свойства, это изменение автоматически повлияет на их функциональность.

Есть ли способ, которым я могу установить свойства локально для функции (некоторый класс-обертка)?

Каковы хорошие практики для установки системных свойств и их использования?

Ответы [ 3 ]

3 голосов
/ 28 августа 2009

Вещи, использующие System.properties, должны иметь свойства, которые имеют глобальное значение для работающей JVM, поэтому, если, например, вы устанавливаете прокси, он должен быть соответствующим прокси во всем этом процессе.

Таким образом, нет необходимости устанавливать их обратно. Фактически, их обратная установка может привести к путанице в некоторых API, так как они могут предполагать, что они всегда возвращают релевантное значение, а не просто кэшируют его, когда читают.

Конечно, если данный API не использует их таким образом, у вас могут быть проблемы, но это действительно будет проблемой с данным API, а не проблемой хорошей практики со свойствами системы.

Как правило, из-за проблем с многопоточностью и синхронизацией рекомендуется устанавливать свойства системы только в начале запуска JVM (либо в командной строке, либо в главном потоке перед запуском других потоков) с ожиданием что значения остаются неизменными в течение оставшегося времени работы JVM.

1 голос
/ 28 августа 2009

Это не отвечает на ваш вопрос о системных свойствах в целом, но относительно вашей конкретной проблемы со свойствами настроек прокси, возможно, вы можете использовать ProxySelector , чтобы изолировать тестовый прокси, который вы упомянули в комментариях здесь?

Вы можете создать подкласс ProxySelector, который вы используете для теста. Сделайте так, чтобы он применял настройки теста только при попытке проверить URI. Это изолировало бы его от других запросов.

Этот тип негибкости глобальных настроек прокси-сервера изначально заставил меня использовать HttpClient для нужд HTTP вместо API Sun.

Edit:

Я не уверен, что когда-либо пропускал этот метод, но можно получить URL-соединение и указать настройки прокси для этого соединения только через java.net.Url.openConnection (Proxy) .

0 голосов
/ 28 августа 2009

Если есть вероятность, что "временные" настройки могут повлиять на какую-то другую часть вашей программы (или другое веб-приложение в контейнере и т. Д.), То их стоит удалить.

Лучшей практикой будет попытаться найти какой-то другой способ сделать то, что вы пытаетесь сделать. Например, рассмотрите возможность создания собственного класса протокола, который переопределяет стандартный класс в той области, где он выясняет, какой прокси использовать.

Если вы не можете этого сделать, попробуйте структурировать свой код так, чтобы последовательность:

  1. изменить свойства,
  2. сделайте операцию,
  3. восстановить свойства,

выполняется в мьютексе, который учитывает все, на что могут повлиять изменяемые вами свойства. Это может быть трудно спросить, хотя ...

...