2016-10-13 2 views
0

로깅 데이터를 클라이언트에 보내기 위해 WebSocketBehavior를 확장하여 개발 중입니다. 로깅 핸들러가 생성되었으며 필요한 경우 실행됩니다.Wicket 7 WebSocketBehavior

정확하게 로그 항목을 클라이언트로 보내고 콘솔 패널을 업데이트하는 방법을 이해하는 데 문제가 있습니다. 나는 이미 onMessage 메소드가 WeSocketRequestHandler를 전달하려는 메시지와 함께 인수로 취하는 콘솔로 재정의해야한다는 것을 알고 있습니다. 정확히 어떻게 onMessage가 제대로 발사 되나요? 여기에 내가 사용하고있는 코드는 다음과 같습니다

public class LogWebSocketBehavior extends WebSocketBehavior { 

private static final long serialVersionUID = 1L; 

Console console; 
private Handler logHandler; 
private Model model; 

public LogWebSocketBehavior(Console console) { 
    super(); 
    configureLogger(); 
    this.console = console; 
} 

private void configureLogger() { 
    Logger l = Logger.getLogger(AppUtils.loggerName); 
    logHandler = getLoggerHandler(); 
    l.addHandler(logHandler); 

} 

@Override 
protected void onMessage(WebSocketRequestHandler handler, TextMessage message) { 
    console.info(handler, model.getObject()); 
} 

private Handler getLoggerHandler() { 
    return new Handler() { 

     @Override 
     public void publish(LogRecord record) { 
      model.setObject(record); 
     } 

     @Override 
     public void flush() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void close() throws SecurityException { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    }; 
} 
private Collection<IWebSocketConnection> getConnectedClients() { 
    IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry(); 
    return registry.getConnections(getApplication()); 
} 

private void sendToAllConnectedClients(String message) { 
    Collection<IWebSocketConnection> wsConnections = getConnectedClients(); 
    for (IWebSocketConnection wsConnection : wsConnections) { 
     if (wsConnection != null && wsConnection.isOpen()) { 
      try { 
       wsConnection.sendMessage("test"); 
      } catch (IOException e) { 
      } 
     } 
    } 
} 

}

내가 필요에 따라 메시지를 제공에 원하는 로거는 작동하지만 실제로 내 콘솔을 업데이트 할 onMessage 메소드를 해고하는 방법을 찾을 수 없습니다. 모든 도움을 주시면 감사하겠습니다 ...

답변

0

#onMessage()은 브라우저가 Wicket.WebSocket.send("some message")을 통해 메시지를 보내면 항상 Wicket에 의해 호출됩니다.

매우 명확하지는 않지만 서버에서 클라이언트 (브라우저)로 메시지를 푸시해야 할 필요가 있습니다. 이 경우 IWebSocketRequestHandler에 대한 핸들을 가져와 #push(String) 메서드를 사용해야합니다. WebSocketSettings.Holder.get(Application.get()).getConnectionRegistry().getConnection(...).push("message")으로이 작업을 수행 할 수 있습니다.

+0

난 그냥 당신에 대해 얘기하고 정확히 추가 한 확장합니다. 그래도 onMessage 메서드는 실행되지 않습니다. –

+0

고맙습니다. 저를 올바른 길로 인도하십시오. 기본적으로 다음과 같이 작동하는 동작이 있습니다. –

+0

사실, 원본에 추가 할 것입니다. –

0

다음은 내가 필요로하는 수업입니다. Martin 고맙습니다 !!

공용 클래스 LogWebSocketBehavior는 WebSocketBehavior {

private static final long serialVersionUID = 1L; 

Console console; 
private Handler logHandler; 
private IModel model; 

public LogWebSocketBehavior(Console console, IModel model) { 
    super(); 
    configureLogger(); 
    this.console = console; 
    this.model = model; 
} 

private void configureLogger() { 
    Logger l = Logger.getLogger(AppUtils.loggerName); 
    logHandler = getLoggerHandler(); 
    l.addHandler(logHandler); 

} 

@Override 
protected void onPush(WebSocketRequestHandler handler, IWebSocketPushMessage message) { 
    super.onPush(handler, message); 
    console.info(handler, model); 
} 

private Handler getLoggerHandler() { 
    return new Handler() { 

     @Override 
     public void publish(LogRecord record) { 
      model.setObject(record); 
      sendToAllConnectedClients(record.toString()); 
     } 

     @Override 
     public void flush() { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 

     @Override 
     public void close() throws SecurityException { 
      throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates. 
     } 
    }; 
} 

private Collection<IWebSocketConnection> getConnectedClients() { 
    IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry(); 
    return registry.getConnections(getApplication()); 
} 

private void sendToAllConnectedClients(String message) { 

    IWebSocketConnectionRegistry registry = new SimpleWebSocketConnectionRegistry(); 

    WebSocketPushBroadcaster b = new WebSocketPushBroadcaster(registry); 
    IWebSocketPushMessage msg = new Message(); 
    b.broadcastAll(getApplication(), msg); 

} 

class Message implements IWebSocketPushMessage { 

    public Message(){ 

    } 

} 

}

관련 문제