Scala 限制仅保留最新消息的akka actor 处境

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

我正在使用akka actors更新我的web客户端上的数据。这些参与者中的一个只负责发送有关单个
代理的更新。这些代理的更新速度非常快(每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
  }