2014-09-30 1 views
1

Я использую Spring 4 + Websockets + Stomp JS library. Я не мог найти никакого способа настроить механизм ping/pong для websocket (heartbeat).Spring 4 + Websockets: как закрыть сеанс?

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" ..."> 

<websocket:message-broker> 
    <websocket:stomp-endpoint path="/cors/auth/clientEndpoint"> 
     <websocket:handshake-handler ref="myHandshakeHandler" /> 
    </websocket:stomp-endpoint> 
    <websocket:simple-broker prefix="/queue, /topic" /> 
    <websocket:client-inbound-channel> 
     <websocket:interceptors> 
      <bean class="com.mycompany.myproject.utils.messaging.MyInboundChannelInterception"></bean> 
     </websocket:interceptors> 
    </websocket:client-inbound-channel> 
</websocket:message-broker> 

<bean id="myHandshakeHandler" class="com.mycompany.myproject.utils.security.MyHandshakeHandler" /> 

<bean class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean"> 
    <property name="maxSessionIdleTimeout" value="120000" /> 
</bean> 

В результате, я реализую свой собственный механизм пинг-понг/сообщений.

Одна из задач здесь - реализовать закрытие на стороне сервера websocket в случае, если сообщение ping больше 10 секунд от клиента.

И не нужно делать это с помощью Spring Websockets!

Может кто-нибудь может сказать мне, как получить доступ к объекту сеанса пользователя или закрыть этот сеанс через Spring Websockets?

Похоже, весна здесь очень ограничена.

ответ

4

В этом случае настройка SockJS в приложении может пойти длинный путь:

<websocket:stomp-endpoint path="/cors/auth/clientEndpoint"> 
    <websocket:handshake-handler ref="myHandshakeHandler" /> 
    <websocket:sockjs/> 
</websocket:stomp-endpoint> 

Это даст вам: поддержка

Если вы хотите фактически закрыть сеанс с конечных точек STOMP, тогда я прихожу вам голосовать/следовать the SPR-12288 JIRA issue.

+0

Брайан, благодарю вас за ответ. Не удается ли достичь управления сердцебиением без sockJs? Мое приложение предназначено для современных браузеров, которые определенно поддерживают websockets. Как результат, sockJs бесполезен в моем случае, потому что мне не нужна эмуляция/резервное копирование. – walv

+1

Вы можете вручную настроить это и проверить, как это делается в рамках (мы используем TaskSchedulers для периодического отправки пульса). SockJS не остановит вас здесь, он по возможности выбирает лучший доступный транспорт (websocket). Не забывайте, что даже если клиенты поддерживают веб-порты, сеть (прокси-серверы HTTP и другие) могут быть недовольны постоянными подключениями, такими как websockets. –

+0

Хорошо, понял. Благодаря!Не уверен в этом утверждении: «Не забывайте, что даже если клиенты поддерживают веб-порты, сеть (HTTP-прокси и другие) может быть недовольна постоянными подключениями, такими как веб-узлы». Любое официальное доказательство этого? Почему он тяжелый? – walv

2

Я удивлен весной документ не упоминает о том, как конфиг сервера пинг ... Кажется, что весной нас ожидает прочитать код вместо прочитайте doc ..

после некоторого времени поиска в сети и чтения исходного кода, я понимаю, что он уже поддерживается, но не задокументирован в заметном месте, таком как spring websocket doc.

Я использую весной 4.3.3, а вот как конфиг сервера пинг без использования sockJS:

@Configuration 
@EnableWebSocketMessageBroker 
public class StompOverWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

    @Override 
    public void registerStompEndpoints(StompEndpointRegistry registry) { 
     registry.addEndpoint("/ws").setAllowedOrigins("*"); 
    } 

    @Override 
    public void configureMessageBroker(MessageBrokerRegistry registry) { 
     registry.setApplicationDestinationPrefixes("/app"); 
     ThreadPoolTaskScheduler pingScheduler = new ThreadPoolTaskScheduler(); 
     pingScheduler.initialize(); 
     registry.enableSimpleBroker("/topic") 
      .setHeartbeatValue(new long[]{20000, 0}).setTaskScheduler(pingScheduler); 
    } 
.... 
} 

и должны убедиться, что вы правильно установить веб-сокет тайм-аута сеанса, оно должно быть больше, чем ping интервал, например:

<bean id="servletServerContainerFactoryBean" class="org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean"> 
    <property name="maxSessionIdleTimeout" value="30000"/> 
</bean> 

 Смежные вопросы

  • Нет связанных вопросов^_^