The Hello World Program
This section contains a simple, working Hello World program. We won’t get into too much details - you can find deeper information in the subsequent sections. We will define a reactor that waits for one incoming event, prints a message to the standard output, and then terminates.
import io.reactors._
object HelloWorld {
def main(args: Array[String]) {
val welcomeReactor = Reactor[String] {
self =>
self.main.events onEvent { name =>
println(s"Welcome, $name!")
self.main.seal()
}
}
val system = ReactorSystem.default("test-system")
val ch = system.spawn(welcomeReactor)
ch ! "Alan"
}
}
The program above declares an anonymous reactor called welcomeReactor
,
which waits for a name to arrive on its main event stream,
prints that name, and then seals its main channel, therefore terminating itself.
The main program then creates a new reactor system,
uses the reactor template to start a new running instance of the reactor,
and sends an event to it.
Above, we note the following:
- A reactor is defined using the
Reactor[T]
constructor. - A reactor reacts to incoming events as specified in the callback function passed
to the
onEvent
method. - Calling
main.seal()
terminates the reactor. - A reactor with a specific definition is started with the
spawn
method, which returns the reactor’s default channel. - Events are sent to the reactor by calling the
!
operator on its channels.
The subsequent sections will explain these features in depth.
Note: If you are running the above example in IntelliJ or another IDE that runs
your Scala programs in a separate JVM process, you need to ensure that this new
JVM process does not die when the main
function ends. Reactors run on daemon
threads by default, so they will not prevent the JVM from terminating. There are
several ways to fix this, and the easiest is to add a Thread.sleep
at the end of
the main
function. A more sophisticated approach is to start your welcomeReactor
on a dedicated thread instead of a thread pool:
val ch = system.spawn(
welcomeReactor.withScheduler(JvmScheduler.Key.newThread))