introducing: MainBus feat. LoggingBus

most tests passing, everything compiling, but docs not updated and nasty
thread-leak preventing me from running the whole test-suite (which is
the reason for this commit: I want to chase down that one first).

- the app.mainbus is classified by Class[_] (currently lookup, will
  possibly change to sub-class-aware) and accepts AnyRef messages
- LoggingBus handles akka.event-handlers from config specially:
  + start them as system services, supervised by SystemGuardian
  + keep their subscriptions in sync when logLevel_= is called
  + send them InitializeLogger(bus) message before subscribing them (so
    they can register for extras like Mute/UnMute)
- two-phased start-up: first phase with actor-less stdout logging, then
  subscription of config loggers, then remove stdout logger (logLevels
  configurable separately)
- MainBusReaper watches registered receivers and unsubscribes them upon
  death (started in phase 2)
- logger factory on Logging object, needs app/bus and log source;
  default instance in app.log
This commit is contained in:
Roland 2011-10-27 12:23:01 +02:00
parent c8b17b9e92
commit f46c6dc533
63 changed files with 749 additions and 643 deletions

View file

@ -7,15 +7,16 @@ import akka.util.duration._
//#imports
import akka.actor.Actor
import akka.event.EventHandler
import akka.event.Logging
//#imports
//#my-actor
class MyActor extends Actor {
val log = Logging(app, this)
def receive = {
case "test" app.eventHandler.info(this, "received test")
case _ app.eventHandler.info(this, "received unknown message")
case "test" log.info("received test")
case _ log.info("received unknown message")
}
}
//#my-actor
@ -30,23 +31,21 @@ class ActorDocSpec extends AkkaSpec {
// testing the actor
// TODO: convert docs to AkkaSpec(Configuration(...))
app.eventHandler.notify(TestEvent.Mute(EventFilter.custom {
case e: EventHandler.Info true
case _ false
}))
app.eventHandler.addListener(testActor)
val eventLevel = app.eventHandler.level
app.eventHandler.level = EventHandler.InfoLevel
val filter = EventFilter.custom {
case e: Logging.Info true
case _ false
}
app.mainbus.publish(TestEvent.Mute(filter))
app.mainbus.subscribe(testActor, classOf[Logging.Info])
myActor ! "test"
expectMsgPF(1 second) { case EventHandler.Info(_, "received test") true }
expectMsgPF(1 second) { case Logging.Info(_, "received test") true }
myActor ! "unknown"
expectMsgPF(1 second) { case EventHandler.Info(_, "received unknown message") true }
expectMsgPF(1 second) { case Logging.Info(_, "received unknown message") true }
app.eventHandler.level = eventLevel
app.eventHandler.removeListener(testActor)
app.eventHandler.notify(TestEvent.UnMuteAll)
app.mainbus.unsubscribe(testActor)
app.mainbus.publish(TestEvent.UnMute(filter))
myActor.stop()
}