Java WS Authenticator в многопоточной среде
На данный момент я борюсь с ошибкой в классе Sun java.net.Authenticator
, Кажется, что Authenticator
класс имеет общесистемную статику Authenticator
, Это приводит к следующей проблеме в моем многопоточном приложении.
- Тема 1 - Аутентификации для пользователя 1
- Поток 2 - аутентификации для пользователя 2
- Поток 1 - выполняет код для загрузки сообщений для пользователя 1
В этот момент система получит сообщения для пользователя 2 вместо сообщений для пользователя 1.
Я пытался найти решение. Многие предлагали попробовать следующий код:
AuthCacheValue.setAuthCache(new AuthCacheImpl());
Authenticator.setDefault(exchangeAuthenticator);
Тем не менее, это не работает для меня, так как мое приложение является многопоточным (exchangeAuthenticator
всегда будет установлен аутентификатор, инициализированный в последнем потоке).
Если у кого-то есть идея, даже хак на данный момент подойдет, я был бы очень признателен, поскольку на данный момент единственное "аккуратное" решение - это разместить synchronized
на основной метод исполнения с драматическим влиянием на производительность.
1 ответ
По моему опыту, вам лучше всего отказаться от встроенной поддержки http и получить Apache HttpClient.
Если это не вариант, создайте отдельный объект, расширяющий Authenticator, но сохраните имя пользователя и пароль в экземплярах ThreadLocal. Таким образом, каждый поток может получить свои собственные значения.