As long as commands lead to simple operations like adding a value to a 
list, there is no different between what we do in receiveRecover 
and receiveCommand so we can merge them together. Regarding DRY, you're 
right but we can create a map of commands to events and use it in 
receiveCommand to be more DRY. Like this:

override def receiveCommand: Receive = {
  case command => persist(commandEventMap(*command*))(receiveRecover(_))
}


This way adding another command would be possible without needing to change 
the `receiveCommand`.

Of course Anders' solution is the best but I was curious if it's possible 
to merge recover and command receivers. Actually several days ago I found 
out that it's not possible to merge them when a command generates and send 
messages to other actors.

On Friday, June 26, 2015 at 1:09:43 PM UTC+4:30, ahjohannessen wrote:
>
> I might have misunderstood your point, please elaborate what you mean. Is 
> it to DRY out things like "event => removeCity(event.cityId)"?
>
> On Friday, June 26, 2015 at 9:31:45 AM UTC+1, ahjohannessen wrote:
>>
>> Validation in the cmd handler is one thing - receiveRecover and cmd 
>> handlers might use the same "apply state", but what it seems you suggest is 
>> that there is no difference between applying events and creating events. 
>> Big difference wrt. validation and replying in persist callback.
>>
>> On Friday, June 26, 2015 at 8:20:30 AM UTC+1, Amir Karimi wrote:
>>>
>>>  Hi,
>>>
>>> Consider the following receives methods of a PersistentActor:
>>>
>>> override def receiveRecover: Receive = {
>>>   case CityAdded(v) => addCity(v)
>>>   case CityRemoved(v) => removeCity(v)
>>> }
>>> override def receiveCommand: Receive = {
>>>   case AddCity(c) => persist(CityAdded(c))(event => addCity(event.cityId))
>>>   case RemoveCity(c) => persist(CityRemoved(c))(event => 
>>> removeCity(event.cityId))
>>> }
>>>
>>> We can call receiveRecover inside the persist block which is more DRY. 
>>> Like this:
>>>
>>> override def receiveRecover: Receive = {
>>>   case CityAdded(v) => addCity(v)
>>>   case CityRemoved(v) => removeCity(v)
>>> }
>>> override def receiveCommand: Receive = {
>>>   case AddCity(c) => persist(CityAdded(c))(receiveRecover(_))
>>>   case RemoveCity(c) => persist(CityRemoved(c))(receiveRecover(_))
>>> }
>>>
>>>
>>> Is it correct? I didn't see anyone do that. What is the problem?
>>>
>>> Regards,
>>> Amir 
>>>
>>

-- 
>>>>>>>>>>      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