How do I disconnect a Scala Remote Actor? -
in scala easy make connection remote actor, documentation not tell me disconnecting. throwing away reference not work, because remote actors actors, these won't collected until stopped. how disconnect?
this not terminate after exit:
import actors.{daemonactor,remote} import remote.{remoteactor,node} object simpleclient{ val messagehandler = new daemonactor{ def act{ loop{ react{ case message:string => println("got message: " + message) case _ => } } } start } def main(args:array[string]){ val server = remoteactor.select(node("localhost",9999),'server) server.send('connect,messagehandler) var exit = false while(!exit){ val message = console.readline if(message == "exit" || message == "quit") { exit = true server ! 'disconnect } else server ! message } } } this server:
import actors.{actor,outputchannel} import actors.remote.remoteactor object server extends actor{ val clients = new collection.mutable.hashset[outputchannel[any]] def act{ loop{ react{ case 'connect => clients += sender case 'disconnect => clients -= sender case message:string => for(client <- clients) client ! message } } } def main(args:array[string]){ start remoteactor.alive(9999) remoteactor.register('server,this) } }
here's working version of source, pertinent changes commented inline:
import actors.{daemonactor,remote} import remote.{remoteactor,node} case class send(message: string) case object disconnect object simpleclient{ val messagehandler = new daemonactor{ def act{ // keep reference proxy inside client-side actor val server = remoteactor.select(node("localhost",9999),'server) server ! 'connect loop{ react{ case message:string => println("got message: " + message) case send(message) => server ! message case disconnect => { // disconnect , exit client-side actor server ! 'disconnect //' exit } case _ => } } } start } def main(args:array[string]){ var exit = false while(!exit){ val message = console.readline if(message == "exit" || message == "quit") { exit = true // tell client-side actor exit messagehandler ! disconnect } else { messagehandler ! send(message) } } } }
Comments
Post a Comment