2009-06-29 11 views
10

私はリモートアクターフレームワークを使用して複数のクライアントと通信するサーバーを持っています。 this questionに記載されているように、私はクライアントが消えたときを追跡するのに問題があります。したがって、私のサーバは存在しないクライアントにメッセージを送信しようとしています。もう存在しないクライアントに書き込もうとすると、remote-actorフレームワークは何をしますか?

  • これは問題ですか? (例外は何も表示されません - サーバーが長寿命の場合はメモリに問題があると思われます)
  • メッセージがクライアントに送信されていることを検出できません。 (接続のクリーンアップを実装したい場合
+0

あなたは、俳優の特性のtrapExitメンバーを見ましたか?それはここに文書化されています:http://www.scala-lang。org/docu/files/actors-api/actors_api_guide_1.html – djondal

答えて

1

[OK]をここで何か危険にさらします。

免責事項:下記に記載されている内容にもかかわらず、start hereがあります。

私はスカラに精通していませんが、Erlangと同様の原則を使用しています。あなたの質問について私を混乱させる事は、これとはほとんど関係がありません。しかし、あなたが確立しているように見えるクライアントとサーバーの関係がもっとあります。

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

サーバーが依然としてクライアントにメッセージを送信しようとしている場合、これらのメッセージが閉じられているにもかかわらず、要求を受信しなくてもメッセージを送信しようとしているようです。これは、クライアントとサーバーの関係の中で根本的に間違っています。サーバーは要求に応じて反応する必要があります。それ以外の場合は、クライアントの役割を引き継いでいます。

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

  1. あなたのクライアントの俳優は、サーバーに停止メッセージを送信すると、関数Scalaは俳優クラスのために実施しているものは何でも出るとその実行を終了する必要があります。

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

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

何とか助けてくれることを願っています。残念ながら私はスカラ自体に精通していません。さもなければ私はいくつかのコードを持ち込むことができますしかし、上記のリンクはうまくいけば助けになるはずです。

+2

このアプローチはうまくいきません。 * stop *メソッドがサーバーに送信されることを保証することはできません。この場合、クライアント・アクターのサーバー・サイド・チャネル* proxy *のメールボックスがいっぱいになり、最終的にメモリーがなくなるとサーバーがクラッシュします。私は唯一のメカニズムがクライアントがタイマーの "リース"を更新することであることを発見しました。サーバは定期的にリースをチェックし、期限切れのものはすべて –

+0

+1に投げ捨てられます。私は同意する。しかし、私はまだメッセージが受信された場合には、通常の、より高速な終了の停止メッセージの周りにそれをコード化したいと思います。 –

関連する問題