斯卡拉的行动者作为单螺纹队列
-
05-07-2019 - |
题
我想要使用行为者在一个程序,我有某种限制周围的治疗的一些行为者,如果他们的队列。例如,假设我有一些外部系统的更改事件应用,还有一些缓的外部系统的数据。所以我有2个行动者:
ChangeApplicationActor
CacheActor
作为一部分 ChangeApplicationActor
, 当我将更改应用于一些实体 X
在外部系统,我想送些事件告诉 CacheActor
以同步:
val changeApplicationActor = actor {
loop {
react {
case ChangeInstruction(x) =>
externalSystem.applyChange(x)
cacheActor ! Sync(x)
}
}
}
但我现在有两个要求:
- 的
CacheActor
拥有内部状态和理想情况下,我想它来处理它的Sync
说明的顺序 - 如果我结束的
CacheActor
's电子邮件收件箱含有两个Sync(x)
说明的同样价值的x
, 然后我想到忽略的第二个(即我应该只有一个待决的Sync
指令对于任何给定的数值x
)
是否有任何方式强迫一个演员是个螺纹?是否有任何种方式我可以访问演员的邮箱和消除任何重复的事件?我可以避免不执行 CacheActor
因为,嗯, 不是演员?
解决方案
一个演员是保证只有执行一个线程的时间,并且该信息在演员的邮箱是在先进先出的订单,那么#1。
2棘手,因为没有系统的支持。有一个属性,演员叫做"邮箱。" 你可以访问的邮箱直接而不是通过接受或反应。你所要做的就是拉匹配同步的消息出来的邮箱之前完成处理的信息。在这样做时,必须同步上演员为了保持另外一个线程的企图添加的东西的邮箱过一个消息发送。
应当注意到同步的演员可消除的僵局的自由的保障,由库,并且将减少可伸缩性。但是,从实际的观点来看可能你会好的。
不隶属于 StackOverflow