首页 > 解决方案 > 尝试使持久性参与者需要带有 RequiresMessageQueue 的自定义邮箱时出错

问题描述

我尝试以下方法:

class ClientActor (stockActor: ActorSelection, paymentsActor: ActorSelection) extends PersistentActor
  with AtLeastOnceDelivery with akka.actor.ActorLogging with RequiresMessageQueue[akka.custom.CustomMailbox]{
//actor implementation

}

我得到错误:

illegal inheritance;

     self-type Shopping.ClientActor does not conform to akka.dispatch.RequiresMessageQueue[akka.custom.CustomMailbox]'s selftype akka.dispatch.RequiresMessageQueue[akka.custom.CustomMailbox]
      with AtLeastOnceDelivery with akka.actor.ActorLogging with RequiresMessageQueue[akka.custom.CustomMailbox]{

同样适用于非持久性演员:

    class PaymentsActor extends Actor with akka.actor.ActorLogging with RequiresMessageQueue[akka.custom.CustomMailbox] {
    // actor implementation
}

标签: scalaakka

解决方案


跟踪相关的源代码,PersistentActorextendsEventsourced扩展了PersistenceStash,后者又扩展了trait Stash

trait Stash extends UnrestrictedStash with RequiresMessageQueue[DequeBasedMessageQueueSemantics]

如源代码中所述:

请注意,该Stash特征只能与具有基于双端队列的邮箱的参与者一起使用。默认情况下,基于 Stash 的 Actor 请求基于 Deque 的邮箱,因为 stash trait extends RequiresMessageQueue[DequeBasedMessageQueueSemantics]DequeBasedMessageQueueSemantics您可以覆盖通过配置请求时提供的默认邮箱 ...

一种方法是配置您的自定义邮箱,类似于源代码备注中的建议:

akka.actor.mailbox.requirements {
  "akka.dispatch.BoundedDequeBasedMessageQueueSemantics" = your-custom-mailbox
}

推荐阅读