2017-09-25 9 views
0

(下部にある更新/修正)PlayFramework 2.xを使用して、アクタを使用して簡単なWebSocketアプリケーションを作成しています。私は物事を働かせることができる(エコーpingを送信する)が、私は何も送受信されない場合、WebSocketが短い時間(約30秒)後になぜ切断するのだろうか?私は、Websocketを使用して終了時に通知を返すために、長時間(5〜20分)プロセスを実行しています。私のAkka WebSocketアクターが切断/死にかけているのはなぜですか?

postStopを入れて、アクタが停止していて実際にヒットしたかどうかを確認します。たぶん、私は俳優のライフサイクルを理解できないでしょうか?親の俳優がいないので、この場合、なぜ俳優が殺されるのか、私はドキュメントで何も見つけることができません。

コントローラー:

public WebSocket socket() { 
    return WebSocket.Text.accept(request -> 
      ActorFlow.actorRef(
        WebSocketActor::props, 
        actorSystem, materializer 
      ) 
    ); 
} 

俳優

public class WebSocketActor extends AbstractActor { 
public static Props props(ActorRef out) { 
    return Props.create(WebSocketActor.class, out); 
} 

private final ActorRef out; 

public WebSocketActor(ActorRef out) { 
    this.out = out; 
    ActorSystem actorSystem = context().system(); 
} 

@Override 
public Receive createReceive() { 

    return receiveBuilder() 
      .match(String.class, message -> 
        out.tell("Message: " + message, self()) 
      ) 
    } 

public void postStop() { 
    System.out.println("I'm dying over here!"); 
} 

} 

UPDATE:ありがとう@chunjef。私は実際にアイドルタイムアウトを設定する必要がありましたが、いくつかのapplication.config値がdevモードでは使用されないため、プロダクションモードで起動しなければなりませんでした。なぜ彼らはそれをこのように設定しましたか、私は分かりませんし、非常にイライラしています。注:devモードでは、runコマンドを使用すると、 application.confの設定がサーバによって選択されません。 devモードでは、アプリケーションクラスパス が使用可能になる前にサーバーが起動するため、これは です。代わりに を使用する必要があるいくつかの他のオプションがあります。

答えて

1

コードでは、アクタのライフサイクルはWebSocket接続に関連付けられています。接続が閉じられると、Playは自動的にアクタを停止します。そして、あなたの接続は、それが長すぎるために非アクティブであるため、終了しています。

アッカHTTP documentationから(アッカHTTPは、プレイ中の根本的なエンジンである):

非アクティブのWebSocket接続がidle-timeout settingsに応じて削除されます。非アクティブな接続を維持する必要がある場合は、アイドルタイムアウトを調整するか、定期的に「キープアライブ」メッセージを注入することができます。

あなたは上記のリンクで説明したようにidle-timeout設定を変更または同等のプレイの設定を変更することができますが(再生設定がアッカのHTTP設定を上書きします)hereを説明しました。たとえば、Play設定でタイムアウトを完全に無効にするには:

idleTimeout = infinite 
関連する問題