2016-11-04 6 views
0

스프링 세션 websocket 샘플의 클러스터링을 테스트하고 있습니다.websocket 세션 샘플이 클러스터되지 않습니다 .. spring-session-1.2.2

docs : http://docs.spring.io/spring-session/docs/current/reference/html5/guides/websocket.html에 설명 된대로 샘플을 실행 중입니다. 코드 : https://github.com/spring-projects/spring-session/archive/1.2.2.RELEASE.zip.

하나의 Tomcat 서버에서 앱을 실행하면 모두 정상적으로 작동합니다. 하지만 두 대의 서버에서 두 개의 앱을 실행하면 모두 작동하지 않습니다.

두 개의 Tomcat 서버 각각에서 8080과 8090으로 응용 프로그램을 시작하고 각각에 로그인하십시오. 8080이 예상대로 작동합니다. 8090은 예상대로 나타나며 8080의 사용자 이름을 나열합니다. 그러나 8090의 사용자 이름은 절대로 8080의 목록에 추가되지 않습니다.

웹 페이지를 8090으로 새로 고치면 사용자가 목록에서 제거되고 사용자 8090은 8080에 대한 목록에 추가됩니다.이주기는 두 앱에서 계속됩니다.

스프링 세션이 세션 정보를 공유하고있는 것처럼 보입니다. 두 로그인 모두 Redis 항목을 볼 수 있습니다.

이 샘플을 여러 서버에서 실행해야합니까?

미리 감사드립니다.

+0

pls가 대답 할 수있는 사람이 있습니까? – criedluv

+0

나는 spring-session-mongo와 같은 문제가있다. 하나의 응용 프로그램 인스턴스에서 완벽하게 작동하지만 두 번째 인스턴스를 추가하면 websocket이 인스턴스간에 공유되지 않습니다. –

답변

0

스톰 브로커 릴레이를 구성했으며 AbstractSessionWebSocketMessageBrokerConfigurer 클래스를 사용하여 스프링 세션으로 WebSocket을 구성했다고 가정합니다. 그 후에도 기본 공개 메커니즘이 로컬 sessionsRepository를 사용하여 사용자의 소켓 ID를 해결하기 때문에 클러스터가 작동하지 않습니다. 우리는이 메커니즘을 원하지 않습니다. 원격 저장소를 사용해야합니다. removeRepository는 이미 스프린트에 존재합니다. 활성화하려면 MessageBrokerRegistry를 구성하면됩니다.

registry.enableStompBrokerRelay("/topic/", "/queue/", "/exchange/") .setUserDestinationBroadcast("/topic/logbook-unresolved-user") .setUserRegistryBroadcast("/topic/logbook-user-registry") 

잘 작동합니다. 나는 그것이 도움이되기를 바랍니다.