Вы можете использовать ~ синглтон, прочитайте этот вопрос и соответствующие страницы здесь и здесь .Самым чистым является инициализация в статическом блоке, но это не всегда возможно.
Простой и понятный подход заключается в синхронизации одного экземпляра и ожидании всех вызовов WS.Это отлично подойдет для малой мощности.Использование ReentrantLock может несколько улучшить эту логику - например, отправка тайм-аута WS-ответа, а не весь HTTP-вызов.
Если вам нужно много одновременных сеансов, рассмотрите возможность проверки того, может ли сервер войти в систему с несколькими клиентами, изатем инициализируйте столько клиентов, сколько хотите, - затем используйте ReentrantLock каким-либо образом, чтобы определить, какой из них в настоящее время свободен.
В зависимости от логики в ваших вызовах WS (требуется ли подтверждение того, что сообщение отправлено в XMPP?), Вы можете рассмотреть вопрос об организации очереди вызовов и их обслуживании из другого потока, возвращая вызов WS до того, как фактическое сообщение будетотправлено (время удержания http обычно составляет 30 секунд, но его можно изменить).
Возможно даже позволить каждому сеансу WS подключаться и иметь собственный сеанс на время вызова.
Редактировать: Я предлагаю вам пойти с
// Correct lazy initialization in Java
@ThreadSafe
class Foo {
private static class HelperHolder {
public static Helper helper = new Helper();
}
public static Helper getHelper() {
return HelperHolder.helper;
}
}
, где Helper
- вспомогательный класс, который извлекает логининформация откуда-то, оборачивает клиентский класс XMPP или
- сам клиентский класс XMPP с жестко запрограммированной информацией для входа в систему.
Затем просто используйте синхронизированный оператор для возвращаемого объекта.