Akka persistentChannel在确认后不会从Journal中删除消息

时间:2014-03-11 02:41:41

标签: scala persistence akka

我正在编写一段代码,使用PersistentChannel向执行某些IO的actor发送消息。完成后,它确认ConfirmablePersistent消息。 该文件说,确认后,该消息将在PersistentChannel中删除。但在我的情况下,我的文件保留在日志中而不会被删除。 我的要求是,一旦我获得IO的成功结果或截止日期已超过持久性消息,应从期刊中删除。

class IOWorker(config: Config, ref: ActorRef) 
    extends Actor with ActorLogging {
  import IOWorker._
  val channel = context.actorOf(PersistentChannel.props(
      PersistentChannelSettings(redeliverInterval = 1.minute, 
           pendingConfirmationsMax = 1,pendingConfirmationsMin = 0)))  
  val doIOActor = context.actorOf(DOIOActor(config))    
  def receive = {
      case payload @ (msg, deadline)=> 
        channel ! Deliver(Persistent(payload), doIOActor.path)
  }
}

object DOIOActor {  
  def apply(config: Config) = Props(classOf[DOIOActor], config)
}
class DOIOActor(config: Config) extends Actor 
    with ActorLogging {

  def receive = {
    case p @ ConfirmablePersistent(payload, sequenceNr, redeliveries) =>      
      payload match {
          case (msg, deadline: Deadline) => 
            deadline.hasTimeLeft match {
              case false => p.confirm()
              case true =>              
                sender ! SAVED(msg)
                Try{DOIO}
                match 
                {
                  case Success(v) =>
                    sender ! SUCCESS(msg)
                    p.confirm()
                  case Failure(doioException) => 
                    log.warning(s"Could not complete DOIO. $doioException")
                    throw doioException
                }
      }
  }

}
  def DOIO(ftpClient: FTPClient, destination: String, file: AISData) = {    
    SOMEIOTASK match {
      case true => log.info(s"Storing file to $destination.")
      case false => 
        throw new Exception(s"Could not DOIO to destination $destination")
    }
  }
}

1 个答案:

答案 0 :(得分:1)

大多数期刊实施都会异步执行删除操作,如on the mailing list所述。