10

リモート アクター フレームワークを使用して複数のクライアントと通信するサーバーがあります。この質問で述べたように、クライアントがいつ姿を消したのかを追跡するのに苦労しています。したがって、私のサーバーはまだ存在しないクライアントにメッセージを送信しようとしています。

  • これは問題ですか?(例外がスローされることはありませんが、サーバーの寿命が長い場合はメモリの問題があると思います)
  • メッセージがリッスンしていないクライアントに送信されていることを検出するにはどうすればよいですか? (何らかの接続クリーンアップを実装したい場合)
4

1 に答える 1

1

OK、ここで何か危険を冒します。

免責事項:以下で読む内容にもかかわらず、ここから始めたいと思うかもしれません。

私はscalaに精通していませんが、Erlangと同様の原則を使用しており、そこでは多少快適に感じます。しかし、あなたの質問について私を混乱させていることは、これとはほとんど関係がありません。しかし、クライアントとサーバーの関係をさらに強化すると、確立しているように見えます。

定義上、サーバーは要求を受信しない限り、クライアントにメッセージを送信し続けることはありません。つまり、サーバーアクタークラスは、受信したメッセージをチェックしてそれに応じて動作するcaseステートメントを中心に構築する必要があります(必ずしもそうとは限りません)。したがって、このコンテキストでは、クライアントは存在し、サーバーはそれについて心配する必要はなく、代わりに通常どおり応答メッセージを送信する必要があります。これは、クライアントが要求でプレゼンスを認識したためです。

したがって、サーバーがクライアントにメッセージを送信しようとしている場合、これらはシャットダウンされていますが、要求を受信して​​いないにもかかわらず、メッセージを送信しようとしているように見えます。これは、クライアントサーバー関係のコンテキストでは根本的に間違っています。サーバーは要求に応じてのみ反応する必要があります。それ以外の場合は、クライアントの役割を引き受けます。

いずれの場合も、クライアント/サーバー会話の終了を定義できます(そして定義する必要があります)。これは、リソースを解放し、確立された接続を終了するのに役立ちます。その効果のために:

  1. クライアントアクターはサーバーに停止メッセージを送信し、scalaがアクタークラスに実装した終了関数を使用してサーバーの実行を終了する必要があります。

  2. 停止メッセージを受信すると、サーバーアクターはクライアントに応答しないようにする必要があります。代わりに、クライアントアクターと同様に、クリーンアップ(存在する場合)を実行して実行を終了する必要があります。

このようにして、関係するすべてのアクターの適切な終了とリソースの正しいリリースを保証します。

これが何らかの形で役に立ったことを願っています。残念ながら、私はscala自体に精通していません。そうでなければ、私はいくつかのコードを持ち込むことができます。しかし、うまくいけば、上記のリンクが役立つはずです。

于 2009-08-03T14:18:44.287 に答える