Ich möchte ein Merkmal definieren, das mit einem Akka-Actor gemischt werden kann, der nach einer endlichen Dauer ein Empfangs-Timeout einplant. Hier ist eine Skizze von dem, was ich tun will ...Zugriff auf Akka Actor-Kontext in einem Mixin
trait BidderInActivityClearingSchedule[T <: Tradable, A <: Auction[T, A]]
extends ClearingSchedule[T, A] {
this: AuctionActor[T, A] =>
context.setReceiveTimeout(timeout) // can I call this here?
def timeout: FiniteDuration
override def receive: Receive = {
case ReceiveTimeout =>
val (clearedAuction, contracts) = auction.clear
contracts.foreach(contract => settlementService ! contract)
auction = clearedAuction
case message => this.receive(message)
}
}
class FancyAuctionActor[T <: Tradable](val timeout: FiniteDuration, ...)
extends AuctionActor[T, FancyAuctionActor[T]]
with BidderInActivityClearingSchedule[T, FancyAuctionActor[T]]
... aber ich verstehe nicht, wenn die context.setReceiveTimeout
aufgerufen. Wird es als Teil des Konstruktors aufgerufen, wenn der MyFancyAuctionActor
aufgerufen wird? Oder wird es früher aufgerufen und so eine Art von Fehler aufgrund der Tatsache, dass timeout
wurde nicht definiert.
Keine schlechte Idee, Actor Lifecycle Hooks zu verwenden, aber ich möchte nicht Actor erweitern Ich möchte das Merkmal als Mixin behalten. – davidrpugh
Soweit ich weiß, ist der am besten praktizierte Ansatz für stapelbare Mixine, dass alle Mixins eine Basiseigenschaft erweitern. Sie tun praktisch dasselbe, indem Sie die Annotation des Typs self haben, nur in Ihrem Fall entziehen Sie sich den Vorteil der Überschreibung von Methoden. Es gibt auch einen weiteren Trick, um stapelbare Mixins zu implementieren, die ich als ein Update beschreiben werde, um zu antworten – shayan
Ich bin mit stapelbarem Aktormuster vertraut und verwende es in der Bibliothek. Vielleicht bin ich pedantisch, aber ich mag es nicht, Eigenschaften zu haben, die eindeutig von Actor ausgehen. – davidrpugh