Scala 限制仅保留最新消息的akka actor 处境
我正在使用akka actors更新我的web客户端上的数据。这些参与者中的一个只负责发送有关单个Scala 限制仅保留最新消息的akka actor 处境,scala,akka,throttling,akka-actor,Scala,Akka,Throttling,Akka Actor,我正在使用akka actors更新我的web客户端上的数据。这些参与者中的一个只负责发送有关单个代理的更新。这些代理的更新速度非常快(每10毫秒一次)。我现在的目标是限制这种更新机制,以便每300毫秒发送一次最新版本的代理 我的代码 这就是我到目前为止的想法: /** *单个代理的更新速度非常快。为了限制web前端的负担,我们在这里限制消息。 */ 类BroadcastSingleAgentActor扩展了Actor{ 私有隐式val ec:ExecutionContextExecutor=c
代理的更新。这些代理的更新速度非常快(每10毫秒一次)。我现在的目标是限制这种更新机制,以便每300毫秒发送一次最新版本的代理
我的代码
这就是我到目前为止的想法:
/**
*单个代理的更新速度非常快。为了限制web前端的负担,我们在这里限制消息。
*/
类BroadcastSingleAgentActor扩展了Actor{
私有隐式val ec:ExecutionContextExecutor=context.dispatcher
private var queue=Set[Agent]()
context.system.scheduler.schedule(0秒,300毫秒){
queue.foreach{a=>
broadcastAgent(self)(a)//将消息发送到所有连接的客户端
}
队列=集合()
}
覆盖def接收:接收={
//对于在场的每个代理,每10毫秒接收一次此消息
案例广播代理(代理)=>
//仅保留代理的最新版本
queue=queue.filter(u.id!=agent.id)+agent
}
}
问题:
此actor(BroadcastSingleAgentActor
)按预期工作,但我不能100%确定这是否是线程安全的(在可能清除队列的同时更新队列)。而且,我觉得我并没有充分利用akka提供给我的工具。我发现了这一点(在Akka 2中限制消息),但我的问题是我需要保留最新的Agent
消息,同时删除任何旧版本的消息。是否有类似于我所需的示例?否,这不是线程安全的,因为通过ActorSystem
的调度将发生在接收
之外的另一个线程上。一个可能的想法是在receive
方法中进行调度,因为发送到BroadcastSingleAgentActor
的传入消息将按顺序处理
override def receive: Receive = {
case Refresh =>
context.system.scheduler.schedule(0 seconds, 300 milliseconds) {
queue.foreach { a =>
broadcastAgent(self)(a) // sends the message to all connected clients
}
}
queue = Set()
// this message is received every 10 ms for every agent present
case BroadcastAgent(agent) =>
// only keep the newest version of the agent
queue = queue.filter(_.id != agent.id) + agent
}