2016-10-13 11 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

ここで私が必要とするクラスがあります。マーティンありがとうございます!

パブリッククラス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(){ 

    } 

} 

}

関連する問題