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

Popular posts from this blog

matlab - Deleting rows with specific rules -

php - MySQLi multi_query results for later use -