Java WS Authenticator в многопоточной среде

На данный момент я борюсь с ошибкой в ​​классе Sun java.net.Authenticator, Кажется, что Authenticator класс имеет общесистемную статику Authenticator, Это приводит к следующей проблеме в моем многопоточном приложении.

  1. Тема 1 - Аутентификации для пользователя 1
  2. Поток 2 - аутентификации для пользователя 2
  3. Поток 1 - выполняет код для загрузки сообщений для пользователя 1

В этот момент система получит сообщения для пользователя 2 вместо сообщений для пользователя 1.

Я пытался найти решение. Многие предлагали попробовать следующий код:

AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(exchangeAuthenticator);

Тем не менее, это не работает для меня, так как мое приложение является многопоточным (exchangeAuthenticator всегда будет установлен аутентификатор, инициализированный в последнем потоке).

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

1 ответ

Решение

По моему опыту, вам лучше всего отказаться от встроенной поддержки http и получить Apache HttpClient.

Если это не вариант, создайте отдельный объект, расширяющий Authenticator, но сохраните имя пользователя и пароль в экземплярах ThreadLocal. Таким образом, каждый поток может получить свои собственные значения.

Другие вопросы по тегам