I'd like to use actors in a program where I'll have some kind of restriction around treating some of the actors as if they were queues. For example, suppose I have some external system to which change events are applied and also some cache of the external system's data. So I have 2 actors:
ChangeApplicationActor
CacheActor
As part of the ChangeApplicationActor
, when I apply a change to some entity X
in the external system, I want to send some event to tell the CacheActor
to sync:
val changeApplicationActor = actor {
loop {
react {
case ChangeInstruction(x) =>
externalSystem.applyChange(x)
cacheActor ! Sync(x)
}
}
}
But I Now have two requirements:
- The
CacheActor
has internal state and ideally I'd like it to process itsSync
instructions sequentially - If I end up with the
CacheActor
's inbox containing twoSync(x)
instructions for the same value ofx
, then I'd like to ignore the second one (i.e. I should only have one pendingSync
instruction for any given value ofx
)
Is there any way of forcing an actor to be single-threaded? Is there any way I can access the actor's mailbox and remove any duplicate events? Can I not avoid implementing the CacheActor
as, um, not an Actor?