2016-10-13 48 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(){ 

    } 

} 

}