2016-05-26 11 views
-1

Tyrusの実装を使用してWebSocketサーバーを作成しましたが、CPU使用量の50%が使用されますが、理由はわかりません。最初は私はそれ以外のプロセスだと思ったが、それ以降は非常にシンプルなwsサーバーを書いたが、それはまだ同じだ...WSサーバーでCPU使用が異常になっています

リソースモニター(Windows Server 2008 R2)のスクリーンショットです: enter image description here

サーバーは、インテル(R)Xeon(R)CPU上で動作するE5-2650 0 @私は正確なアーキテクチャを知らない 4GBのメモリを搭載した2.00 GHzの...簡略化の

コードwsサーバー:

package wstest; 

import javax.websocket.DeploymentException; 
import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.glassfish.tyrus.server.Server; 

public class Wstest { 

private static final Logger logger = LogManager.getLogger(); 

public static void main(String[] args) { 
    runServer(); 
} 

private static void runServer() { 
    Server server = new Server("localhost", 8025, "/tp", null, wsendpoint.class); 
    Runtime.getRuntime().addShutdownHook(new Thread() { 
     @Override 
     public void run() { 
      logger.info("Server stopped."); 
     } 
    }); 
    try { 
     server.start(); 
     logger.info("Server started."); 
     while (true) { } 
    } catch (DeploymentException ex) { 
     logger.fatal(ex); 
    } 
} 

} 



package wstest; 

import javax.websocket.CloseReason; 
import javax.websocket.OnClose; 
import javax.websocket.OnError; 
import javax.websocket.OnMessage; 
import javax.websocket.OnOpen; 
import javax.websocket.Session; 
import javax.websocket.server.ServerEndpoint; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 

@ServerEndpoint(
    value = "/test" 
) 
public class wsendpoint { 

private static final Logger logger = LogManager.getLogger(); 

@OnOpen 
public void onOpen(Session session) { 
    logger.info("Client " + session.getId() + " connected"); 
} 

@OnClose 
public void onClose(Session session, CloseReason closeReason) { 
    logger.info("Client " + session.getId() + " disconnected."); 
} 

@OnMessage 
public void onMessage(String request, Session session) { 
    logger.info(session.getId() + " sent message : " + request); 
} 

@OnError 
public void onError(Session session, Throwable t) { 
    logger.error("Error !", t); 
} 

} 

は、ここで私が使用しているlibrairies:

enter image description here

+0

理由は明らかです.Jur Clerkx氏の答えによると、 'while(true){}'はスピンロックなので、どこで使用するのかわかりませんが、停止してください。 'while'を削除すると、プログラムは実行を停止しますか? – Kayaman

+0

しばらくすると停止します。 – Phoste

答えて

1

サーバーが稼働し続けるwhileループに制限はありません。このため、完全なCPU使用率は、何も起こっていない間にこれをできるだけ早く作成するようになります。私はかなりThread.sleep(5)を追加すると問題を解決すると確信しています。ソケットを聞いたサーバーを作るのに必要な時代の大部分を修正しました。しかし、これがベストプラクティスかどうかはわかりません。

+0

そうではありません。 'Server'はサーバがシャットダウンされるまでプログラムを実行し続ける非デーモンスレッドを開始することに私は賭けるでしょう。 – Kayaman

+0

チップをありがとう、おそらくそれはベストプラクティスではないが、少なくともそれは働いた:) – Phoste

+0

@Phoste悪いコードを書く前にドキュメントを読むことに決めたら、ここから始めるのが良い:https://tyrus.java.net /documentation/1.0/user-guide.html#standalone-mode – Kayaman

関連する問題