Hi Damon,

if you use context.become(stateB) in your concrete actor you replace the
receive function defined in stackable traits with stateB. I think instead
of using context.become you should make wrappedReceive a var and change
that to whichever state you want your concrete actor to have.

I did a quick experiment <https://gist.github.com/2m/1695454e19fff3260dc8>
with this.


On Sat, Aug 30, 2014 at 8:47 AM, Damon Rolfs <[email protected]> wrote:

> I am hoping for some guidance on how to handle message envelope processing
> outside of my concrete PersistentActors. In my system I am wrapping
> commands in an envelope. I wrote a stackable trait to abstract the envelope
> handling away from my business logic.
>
> I am following the pattern as described by Ooyala
> <http://www.slideshare.net/EvanChan2/akka-inproductionpnw-scala2013> (slides
> 15+):
>
> trait PersistentActorStack extends PersistentActor { outer: ActorLogging
> =>
>   def wrappedReceiveCommand: Receive
>   def wrappedReceiveRecover: Receive
>
>   override def receiveCommand: Receive = {
>     case c if wrappedReceiveCommand.isDefinedAt( c ) =>
> wrappedReceiveCommand( c )
>     case c => unhandled( c )
>   }
>
>   override def receiveRecover: Receive = {
>     case e if wrappedReceiveRecover.isDefinedAt( e ) =>
> wrappedReceiveRecover( e )
>     case e => unhandled( e )
>   }
> }
>
> My concrete actor ultimately extends this trait and implements a state
> machine via become with something like the following states:
>
> val stateA: Receive = { ... }
> val stateB: Receive = { ... }
> val stateC: Receive = { ... }
>
> I start off with startA:
>
> override def wrappedReceiveCommand: Receive = stateA
>
> The actor behaves and processed commands as expected until I become
> another state; e.g., stateB. Once I call context.become( stateB ), the
> state isn't recognized and I see that wrappedReceiveCommand is called and
> returning stateA. (I used logging to see this.) This doesn't surprise me,
> however the examples I've seen in tutorials and tests utilize
> context.become(). I am struggling to find non-trivial example using become
> with a stackable trait pattern. Do they fit together? Is there a suggested
> alternative.
>
> Thanks so much for your advice!
>
> Damon
>
>  --
> >>>>>>>>>> Read the docs: http://akka.io/docs/
> >>>>>>>>>> Check the FAQ:
> http://doc.akka.io/docs/akka/current/additional/faq.html
> >>>>>>>>>> Search the archives: https://groups.google.com/group/akka-user
> ---
> You received this message because you are subscribed to the Google Groups
> "Akka User List" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
> Visit this group at http://groups.google.com/group/akka-user.
> For more options, visit https://groups.google.com/d/optout.
>



-- 
Martynas Mickevičius
Typesafe <http://typesafe.com/> – Reactive
<http://www.reactivemanifesto.org/> Apps on the JVM

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to