2017-04-06 5 views
1

Jetty는 org.eclipse.jetty.websocket.common.BlockingWriteCallback을 사용하여 websocket을 통해 메시지를 보냅니다. 클라이언트가 "느린"경우 블로킹 쓰기가 중단 될 수 있습니다 (예 : https://github.com/eclipse/jetty.project/issues/272#issuecomment-290910610 참조)WebSocket 보내기 비 블로킹

나는 Jetty + Spring + Spring의 Websocket Client를 사용하여 느린 클라이언트를 성공적으로 시뮬레이션합니다.

websocket 메시지를 "보내고 잊어 버리고 싶습니다."클라이언트가 느린 경우 (어떤 확인을 시도하든) BrokerWriteCallback의 해결에는 영향을 미치지 않습니다. Jetty (구성 또는 소스 코드 편집)를 통해이를 달성하는 가장 좋은 방법은 무엇입니까

현재 Jetty 버전 9.3.11.v20160721은 Spring 4.3.3과 함께 사용됩니다.

답변

1

부두는 이미 slow serverslow client 테스트를 보유하고 있습니다.

무한한 버퍼링을 의미하는 "보내기 및 잊기"와 같은 것은 없습니다.

옵션을 보낼 비 차단이있다, 그러나 강하게는 로컬 엔드 포인트가 성공적으로 메시지를 전송 (또는하지) 않으면 알고 Futures 또는 Callbacks받는 관심을 지불 격려 입니다.

힌트 : 이전에 성공하지 못한 경우 (네트워크 혼잡을 처리해야 함) RemoteEndpoint에 다른 메시지를 보내지 마십시오. Futures 또는 Callbacks것이다 트리거 메모리 오류 (KMS)에주의를 지불하는

실패.

RemoteEndpoint 참조 :

이 모든 것이 압도적 인 것으로 판단되면 websocket 위에 구축 된 많은 라이브러리 중 하나를 사용하여이 모든 것을 관리하십시오.

오픈 소스 프로젝트를 살펴 보시기 바랍니다. cometd.org

+0

고맙습니다! 당신이 문제가있는 부분에 대해 자세히 설명해 주시겠습니까? 콜백을 사용하여 sendString을 가정합니다. 클라이언트가 메시지를 받거나 "네트워크에 기록"되었을 때 콜백이 반환되지만 클라이언트로부터 확인을받지 못합니까? 솔직히 말해서 저레벨 통신이 얼마나 정확하게 작동하는지 아직 알지 못하며, 이것에 대한 유용한 통찰력을 높이 평가합니다. 클라이언트가 "정지"하면 (수신 실패) 스레드가 차단됩니다. 나는 내 프로그램이 다른 클라이언트에게 데이터를 보낼 수 있기를 원한다. 현재 특정 이유로 단일 스레드 전송을 사용합니다 (단 하나의 스레드가 부두를 호출합니다) –