Akka Actor how to only process the latest message

后端 未结 2 1180
感动是毒
感动是毒 2020-12-30 14:40

Say I am sending messages to an Actor, when it is processing one message several more messages may arise. Now when it is ready to process the next message I want it to only

2条回答
  •  猫巷女王i
    2020-12-30 14:51

    There is no need to implement your own mailbox. At all.

    Removed a lot of text and let this piece of code speak for itself:

    // Either implement "equals" so that every job is unique (by default) or do another comparison in the match.
    class Work 
    case class DoWork(work: Work)
    
    class WorkerActor extends Actor {
      // Left as an exercise for the reader, it clearly should do some work.
      def perform(work: Work): Unit = ()
    
      def lookingForWork: Receive = {
        case w: Work =>
          self forward DoWork(w)
          context become prepareToDoWork(w)
      }
    
      def prepareToDoWork(work: Work): Receive = {
        case DoWork(`work`) =>
          // No new work, so perform this one
          perform(work)
          // Now we're ready to look for new work
          context become lookingForWork
        case DoWork(_) =>
          // Discard work that we don't need to do anymore
        case w2: Work =>
          // Prepare to do this newer work instead
          context become prepareToDoWork(w2) 
      }
    
      //We start out as looking for work
      def receive = lookingForWork
    }
    

    This means that work will only be performed if there is no newer work in the mailbox.

提交回复
热议问题