Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Условное подключение веб-сокетов

Вы можете использовать необязательный атрибут connected для управления автоматическим переподключением веб-сокета.

<f:websocket …​ connected="#{bean.pushable}" />

По умолчанию для атрибута connected установлено значение true, и оно интерпретируется как инструкция JavaScript для открытия или закрытия push-соединения веб-сокета. Если значение является выражением EL и оно установлено в false во время запроса ajax, то принудительное соединение будет явно закрыто во время oncomplete этого запроса ajax.

Вы также можете явно установить для него значение false и вручную открыть push-соединение на стороне клиента, вызвав jsf.push.open(clientId), передав идентификатор клиента компонента.

<h:commandButton ... onclick="jsf.push.open('foo')">
<f:ajax ... />
</h:commandButton>
<f:websocket id="foo" channel="bar" scope="view" ...
connected="false" />

Если вы намереваетесь использовать однократное push-уведомление и не ожидаете больше сообщений, вы можете при желании явно закрыть push-соединение со стороны клиента, вызвав jsf.push.close(clientId), передав компоненту ID клиента. Например, в функции слушателя JavaScript onmessage, как показано ниже:

function someWebsocketListener(message) {
// ... jsf.push.close('foo');
}

События веб-сокета: сервер

Когда сессия или представление автоматически закрываются сервером с кодом причины закрытия 1000 (и, следовательно, не закрываются вручную клиентом через jsf.push.close(clientId)), это означает, что время жизни сессии или представления истекло.

@ApplicationScoped
public class WebsocketObserver {

public void onOpen(@Observes @Opened WebsocketEvent event) {
  String channel = event.getChannel();
  // Возвращает <f:websocket channel>.   
  Long userId = event.getUser();
  // Возвращает <f:websocket user>, если есть.
// ...

}

public void onClose(@Observes @Closed WebsocketEvent event) {
  String channel = event.getChannel();
  // Возвращает <f:websocket channel>.   
  Long userId = event.getUser();
  // Возвращает <f:websocket user>, если есть. 
  CloseCode code = event.getCloseCode();
  // Возвращает код причины закрытия.
// ...
}

События веб-сокета: клиенты

Вы можете использовать дополнительную функцию слушателя JavaScript onopen для обработки события открытия веб-сокета на стороне клиента. Эта функция вызывается при первой попытке подключения, независимо от того, будет ли она успешной. Он не будет вызываться, когда веб-сокет автоматически переподключит разорванное соединение после первого успешного соединения.

<f:websocket ... onopen="websocketOpenListener" />
function websocketOpenListener (channel) {
// ...

}

Функция слушателя JavaScript onopen вызывается с одним аргументом: channel (имя канала, особенно полезно, если у вас есть глобальный слушатель).

Вы можете использовать дополнительную функцию слушателя JavaScript onclose для обработки события завершения (корректного или некорректного) работы веб-сокета. Эта функция вызывается, когда первая попытка подключения не удалась или сервер возвратил код причины закрытия 1000 (нормальное закрытие) или 1008 (нарушение политики безопасности) или было превышено максимальное кол-во попыток повторное соединения. Он не будет вызываться, если веб-сокет делает попытку автоматического переподключения при разорванном соединении после первого успешного соединения.

<f:websocket ... onclose="websocketCloseListener" />
function websocketCloseListener(code, channel, event) {
  if (code == -1) {
  // Веб-сокеты не поддерживаются клиентом.
  } else if (code == 1000) {
  // Корректное завершение (как результат истёкшей сессии или представления).
  } else {
  // Некорректное завершение (как результат ошибки).
  }
}

Функция слушателя JavaScript onclose вызывается с тремя аргументами:

  • code: код причины закрытия в виде целого числа. Если это -1, веб-сокет не поддерживается клиентом. Если это 1000, то он был нормально закрыт. В противном случае, если это не 1000, то может быть ошибка.

  • channel: название канала

  • event: объект CloseEvent


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)