scala - How to use stackable trait pattern with Akka actors? -
i'm trying implement pub/sub trait mix other akka actors using stackable trait.
here came with:
trait pubsubactor extends actor { abstract override def receive = super.receive orelse { case subscribe(topic) => /* ... */ case publish(topic, msg) => /* ... */ } } class myactor extends actor pubsubactor { override def receive = { case somemessage(a, b, c) => /* ... */ } } at point, compiler throws error: error: overriding method receive in trait myactor... method receive needs `abstract override' modifiers.
can explain me why isn't working? how can fix works?
thanks!
update
the following works:
trait pubsubactor extends actor { abstract override def receive = super.receive orelse { case subscribe(topic) => /* ... */ case publish(topic, msg) => /* ... */ } } class myactor extends actor { override def receive = { case somemessage(a, b, c) => /* ... */ } } class myactorimpl extends myactor pubsubactor but why? why can behavior want way not other? reasons? can't seem figure out underlying difference between these 2 samples makes difference.
there's simple , concise solution:
define receiving trait chains multiple receive functions using orelse :
trait receiving { var receivers: receive = actor.emptybehavior def receiver(next: actor.receive) { receivers = receivers orelse next } def receive = receivers // actor.receive definition } using in actors easy:
trait pubsubactor extends receiving { receiver { case publish => /* i'm first handle messages */ } } class myactor extends pubsubactor receiving { receiver { case somemessage => /* pubsubactor didn't handle, receive message */ } } first pubsubactor's receive called. if message wasn't handled passed myactor's receive.
Comments
Post a Comment