(Quick Reference)
Creating an actor using a factory method
import static groovyx.gpars.actor.Actors.actordef console = actor {
loop {
react {
println it
}
}
Sub-classing the DefaultActor class
class CustomActor extends DefaultActor {
@Override protected void act() {
loop {
react {
println it
}
}
}
}def console=new CustomActor()
console.start()
Sending messages
console.send('Message')
console << 'Message'
console.sendAndContinue 'Message', {reply -> println "I received reply: $reply"}
console.sendAndWait 'Message'
Timeouts
import static groovyx.gpars.actor.Actors.actordef me = actor {
friend.send('Hi')
react(30.seconds) {msg ->
if (msg == Actor.TIMEOUT) {
friend.send('I see, busy as usual. Never mind.')
stop()
} else {
//continue conversation
}
}
}me.join()
When a timeout expires when waiting for a message, the Actor.TIMEOUT message arrives instead. Also the
onTimeout() handler
is invoked, if present on the actor:
import static groovyx.gpars.actor.Actors.actordef me = actor {
delegate.metaClass.onTimeout = {->
friend.send('I see, busy as usual. Never mind.')
stop()
} friend.send('Hi')
react(30.seconds) {
//continue conversation
}
}me.join()
Actor groups
def coreActors = new NonDaemonPGroup(5) //5 non-daemon threads pool
def helperActors = new DefaultPGroup(1) //1 daemon thread pooldef priceCalculator = coreActors.actor {
…
}def paymentProcessor = coreActors.actor {
…
}def emailNotifier = helperActors.actor {
…
}def cleanupActor = helperActors.actor {
…
}//increase size of the core actor group
coreActors.resize 6//shutdown the group's pool once you no longer need the group to release resources
helperActors.shutdown()
DynamicDispatchActor
final Actor actor = new DynamicDispatchActor({
when {String msg -> println 'A String'; reply 'Thanks'}
when {Double msg -> println 'A Double'; reply 'Thanks'}
when {msg -> println 'A something ...'; reply 'What was that?'}
})
actor.start()
Reactor
import groovyx.gpars.actor.Actorsfinal def doubler = Actors.reactor {
2 * it
}.start()