2014-11-28 3 views
0

우리는 Grizzly 프로젝트의 웹 소켓을 사용 중이므로 구현시 연결을 통해 들어오는 여러 메시지를 동시에 처리 할 수 ​​있습니다. 이것이 사실이 아니거나 우리가 놓친 구성 단계가있는 것으로 보입니다. 이것을 검증하기 위해 텍스트를 반향 한 후에 onMessage에서 지연되는 수정 된 반향 테스트를 작성했습니다. 클라이언트가 동일한 연결을 통해 여러 메시지를 보내는 경우 서버는 이후 메시지를 처리하기 전에 onMessage가 완료 될 때까지 항상 차단합니다. 예상되는 기능입니까? 다음과 같이Grizzly Websocket 연결에 대한 여러 메시지

단순화 된 서버 코드는 다음과 같습니다

package com.grorange.samples.echo; 
import java.util.concurrent.atomic.AtomicBoolean; 
import org.glassfish.grizzly.http.server.HttpServer; 
import org.glassfish.grizzly.http.server.NetworkListener; 
import org.glassfish.grizzly.websockets.DataFrame; 
import org.glassfish.grizzly.websockets.WebSocket; 
import org.glassfish.grizzly.websockets.WebSocketAddOn; 
import org.glassfish.grizzly.websockets.WebSocketApplication; 
import org.glassfish.grizzly.websockets.WebSocketEngine; 

public class Echo extends WebSocketApplication { 
    private final AtomicBoolean inMessage = new AtomicBoolean(false); 

    @Override 
    public void onClose(WebSocket socket, DataFrame frame) { 
     super.onClose(socket, frame); 
     System.out.println("Disconnected!"); 
    } 

    @Override 
    public void onConnect(WebSocket socket) { 
     System.out.println("Connected!"); 
    } 

    @Override 
    public void onMessage(WebSocket socket, String text) { 
     System.out.println("Server: " + text); 
     socket.send(text); 
     if (this.inMessage.compareAndSet(false, true)) { 
      try { 
       Thread.sleep(10000); 
      } catch (Exception e) {} 

      this.inMessage.set(false); 
     } 
    } 

    @Override 
    public void onMessage(WebSocket socket, byte[] bytes) { 
     socket.send(bytes); 
     if (this.inMessage.compareAndSet(false, true)) { 
      try { 
       Thread.sleep(Long.MAX_VALUE); 
      } catch (Exception e) {} 

      this.inMessage.set(false); 
     } 

    } 

    public static void main(String[] args) throws Exception { 
     HttpServer server = HttpServer.createSimpleServer("http://0.0.0.0", 8083); 
     WebSocketAddOn addOn = new WebSocketAddOn(); 
     addOn.setTimeoutInSeconds(60); 
     for (NetworkListener listener : server.getListeners()) { 
      listener.registerAddOn(addOn); 
     } 

     WebSocketEngine.getEngine().register("", "/Echo", new Echo()); 
     server.start(); 
     Thread.sleep(Long.MAX_VALUE); 
    } 
} 

단순화 된 클라이언트 코드는 다음과 같습니다

+1

클라이언트 코드는 어디에 있습니까? – amitakCs

답변

0

은 예, 예상입니다. 가는 방법은 onMessage 내부의 메시지 처리를 다른 스레드로 전달하는 것입니다.

+0

고마워, 그게 내가 예상 한거야. – nedako

관련 문제