Установите ProxySelector и Authenticator обратно по умолчанию - PullRequest
4 голосов
/ 16 июня 2011

Мне было поручено написать собственную ProxySelector реализацию для нашего текущего проекта OSGi. Чтобы использовать аутентификацию для прокси, мне также пришлось написать собственный Authenticator .

Настройка этих пользовательских реализаций при запуске пакета OSGi прекрасно работает. Но пакеты OSGi можно остановить / удалить, что приводит меня к моему вопросу:

Как мне сбросить мои реализации и восстановить реализации по умолчанию (JVM)?

Пока пакет запускается, я сохраняю реализацию по умолчанию:

ProxySelector defaultSelector = ProxySelector.getDefault()
ProxySelector.setDefault(new MyProxySelector());

К сожалению, у Authenticator нет метода getDefault().

Когда пакет останавливается, я хочу сбросить ProxySelector и Authenticator следующим образом:

ProxySelector.setDefault(defaultSelector); // see above
Authenticator.setDefault(null);

Но это не работает. После остановки связки я не могу устанавливать какие-либо соединения.

Мое единственное объяснение состоит в том, что установка defaultSelector только передает ссылку. Когда мой ProxySelector уничтожен, эти контрольные точки никуда не приводят, поэтому у JVM не будет действительного ProxySelector. Лучшее решение, которое я нашел, было клонировать селектор. Но ProxySelector не имеет clone() метода. Приведение defaultSelector к некоторой реализации по умолчанию ( sun.net.spi.DefaultProxySelector ) может быть не лучшим решением, но может работать. Это может быть проблемой, потому что это может переопределить другие пользовательские реализации, которые были установлены ранее.

Итак, какова ваша лучшая практика для этого?

...