2011-11-09 13 views
0

私は、クライアント側のアクタからのメッセージを非同期的に(!)送って、サーバからアクタにメッセージを返したいと思っています。重要な点は、私は(?)を使用して未来を手に入れたくないということです。将来/尋ねることなくRemoteActorsを使用する

私は次のコード例を持っている:

import akka.actor.Actor._ 
import akka.event.EventHandler 
import akka.actor.{ActorRef, Actor} 


case class FromUser(s: String) 

case class FromServer(s: String) 

class ServerActor extends Actor { 
    protected def receive = { 
    case FromUser(msg) => self.sender ! FromServer(msg) 
    } 
} 

class ClientActor(val remoteServer: ActorRef) extends Actor { 
    protected def receive = { 
    case FromUser(msg) => { 
     EventHandler.info(this, "I got '" + msg + "' from the user.") 
     remoteServer ! FromUser(msg) 
    } 
    case FromServer(msg) => EventHandler.info(this, "I got '" + msg + "' from the server.") 
    } 
} 

object Client { 
    def main(args: Array[String]) { 
    val s = Actor.remote.actorFor("ServerActor", "NYCWD2328", 4552) 
    val c = Actor.actorOf(new ClientActor(s)).start 
    c ! FromUser("Hello") 
    } 
} 

object Server { 
    def main(args: Array[String]) { 
    Actor.remote.start("NYCWD2328", 4552) 
    Actor.remote.register("ServerActor", actorOf(new ServerActor)) 
    } 

} 

このコードは、次のトレースで失敗します。それを行うことが可能であるべきであるように

[GENERIC] [11/9/11 12:32 PM] [RemoteClientWriteFailed(uuid { 
    high: 15711794799146701281 
    low: 10512246108465469656 
} 
actorInfo { 

    .... 

timeout: 5000 
} 
,java.nio.channels.ClosedChannelException,[email protected],/127.0.0.1:2552)] 
[GENERIC] [11/9/11 12:32 PM]  [RemoteClientError(java.nio.channels.ClosedChannelException,[email protected],/127.0.0.1:2552)] 
[ERROR] [11/9/11 12:32 PM] [akka:event-driven:dispatcher:global-3] [LocalActorRef] null 
java.nio.channels.ClosedChannelException 
    at org.jboss.netty.channel.socket.nio.NioWorker.cleanUpWriteBuffer(NioWorker.java:643) 

これがそうです。それは...ですか?

+0

独立したリスンポートを持つActor.remote.startをクライアントに追加すると、クライアントが機能します。これが意図された動作かどうかまだ分かりません。 – themel

+0

はい、そうです。インバウンド接続を受け入れる場合は、リモート処理を開始する必要があります。 (もちろん!/ fire-and-forgetはインバウンド接続を作成する) –

+0

@ViktorKlang:確認をありがとう。私は、この点ではドキュメントがあまりにも素晴らしくないと思っています。「リモートアクターの使い方はメッセージの送信やエラー処理と伝播、監督、リンク、再起動します。 - ソースよりも抽象的なレベルで、これの仕組みについてのどこを知るべきかについてのヒント? – themel

答えて

0

それは古い質問です、万全を期すためにヴィクトルはすでにそれに答えが、私は「応答なし」の状態を好きではないので、:mainメソッドが

object Client { 
    def main(args: Array[String]) { 
    // choose available port on local machine 
    Actor.remote.start("YourHostnameHere", 4553) 
    val s = Actor.remote.actorFor("ServerActor", "NYCWD2328", 4552) 
    val c = Actor.actorOf(new ClientActor(s)).start 
    c ! FromUser("Hello") 
    } 
} 

開始リモートサービスに変更する必要があります(ホストとポート)にはリモートマシンからアクセスできる必要があります。ここでは「NYCWD2328」です。そのリモートホストによって開始された新しい接続を介して返信が送信されるためです。

関連する問題