Этот ответ говорит о Jetty 9 WebSockets.
у вас есть 1 WebSocketClient
, думайте об этом как о браузере, при каждом вызове которого connect()
устанавливается новое соединение.
Каждый вызов connect()
должен иметь новый экземпляр WebSocket, каждый экземпляр будет управляться Executor
WebSocketClient, в результате чего каждый экземпляр веб-сокета будет находиться в своем собственном потоке.
Последующие ответы
В идеале иметь только 1 WebSocketClient и запускать его только один раз. оставьте его запущенным на период времени, когда у вас есть активные соединения через веб-сокет. Остановите WebSocketClient, когда больше нет подключений.
Вообще говоря, избегайте повторного использования объектов для нескольких запросов, если только вы не знаете, что делаете. Пример: ClientUpgradeRequest и URI связаны с сеансом WebSocket, который при повторном использовании в нескольких соединениях будет иметь изменение состояния при закрытии первого соединения, что сделает данные недействительными для других соединений, а также ссылки на сборку мусора. которые затрудняют очистку старых соединений, пока все соединения не будут закрыты.
Вы можете вызвать connect()
одновременно, сделайте это. Каждая попытка подключения обрабатывается на основе поведения Executor (например: если у вас есть однопоточный Executor, то за раз происходит только 1 подключение)
Создание нового WebSocketClient для каждого подключения является чрезмерно расточительством ресурсов. Это было бы похоже на запуск всего веб-сервера для каждого входящего запроса. WebSocketClient управляет селекторами, потоками, отслеживанием сеансов и т. д. Я понимаю, откуда вы пришли, со старыми клиентскими библиотеками http, имеющими такое поведение, но даже эти http-клиенты обновляются до этой новой модели браузера благодаря spdy и http /2.
person
Joakim Erdfelt
schedule
02.03.2015