case class User(name: String) case class Subscribe(user: User) case class Unsubscribe(user: User) case class Post(msg: String) case class UserPost(user: User, post: Post)
import scala.actors.Actor class ChatRoom extends Actor { def act() { // the actor's behavior } }
val chatRoom = new ChatRoom chatRoom.start()
class ChatRoom extends Actor { def act() { while (true) { receive { case Subscribe(user) => // handle subscriptions case Unsubscribe(user) => // handle unsubscriptions case UserPost(user, post) => // handle user posts } } } }
val chatRoom = actor { while (true) { receive { case Subscribe(user) => case Unsubscribe(user) => case UserPost(user, post) => } } }
var session = Map.empty[User, Actor] while (true) { receive { case Subscribe(user) => val sessionUser = actor { while (true) { self.receive { case Post(msg) => // Send message to sender } } } session = session + (user -> sessionUser) // handle UserPost message // handle Unsubscribe message } }
val chatRoom = new ChatRoom chatRoom ! Subscribe(User("Bob"))
var session = Map.empty[User, Actor] while (true) { receive { case Subscribe(user) => val subscriber = sender val sessionUser = actor { while (true) { self.receive { case Post(msg) => subscriber ! Post(msg) } } } session = session + (user -> sessionUser) // handle UserPost message // handle Unsubscribe message } }
val chatRoom = new ChatRoom chatRoom !? Subscribe(User("Bob"))
var session = Map.empty[User, Actor] while (true) { receive { case Subscribe(user) => val subscriber = sender val sessionUser = actor { while (true) { self.receive { case Post(msg) => subscriber ! Post(msg) } } } session = session + (user -> sessionUser) reply("Subscribed " + user) } }
chatRoom !? Subscribe(User("Bob")) match { case response: String => println(response) }
val future = chatRoom !! Subscribe(User("Bob")) // Do useful work println(future()) // Wait for the future
val sessionUser = actor { while (true) { self.receiveWithin (1800 * 1000) { case Post(msg) => subscriber ! Post(msg) case TIMEOUT => room ! Unsubscribe(user) self.exit() } } }
var session = Map.empty[User, Actor] def act() { while (true) { receive { case UserPost(user, msg) => for (key <- session.keys; if key != user) { session(key) ! msg } // Handle Subscribe message // Handle Unsubscribe message } } }
For more information about Actors in Scala, please visit: http://www.artima.com/shop/actors_in_scala and: |
Copyright © 2011 Artima, Inc. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. |