2017-07-18 3 views
0

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.

Antwort

0

schlage ich Controlling Auslöser Ihrer Zeitplan Lifecycle Veranstaltung mit Schauspieler hooks.if Sie Ihr Zug einen Schauspieler wie diese erweitern haben:

trait AuctionActor[T, A] extends Actor 
trait BidderInActivityClearingSchedule[T, A] extends AuctionActor[T,A] 

Sie Zugriff auf viele der Lifecycle-Ereignis-Hooks des Darstellers haben werden wie preStart(), postStop() und viele mehr.

So können Sie ganz einfach tun:

trait BidderInActivityClearingSchedule[T, A] extends AuctionActor[T,A] { 
    override def preStart() = { 
    supre.preStart() // or call this after the below line if must. 
    context.setReceiveTimeout(timeout) // can I call this here? 
    }  
} 

aktualisieren

Wenn Sie einen stapelbaren Mixins Struktur implementieren möchten. Sie würden etwas Ähnliches wie oben tun.

//your AuctionActor is now a class as you wanted it 
class AuctionActor[T, A] extends Actor 

//Look below; the trait is extending a class! it's ok! this means you can 
//only use this trait to extend an instance of AuctionActor class 
trait BidderInActivityClearingSchedule[T, A] extends AuctionActor[T,A]{ 
    def timeout: FiniteDuration 

    //take note of the weird "abstract override keyword! it's a thing!" 
    abstract override def preStart() = { 
    super.preStart() 
    context.setReceiveTimeout(timeout) 
    } 
} 

Sie können so viele Merkmale, die Ihre Klasse AuctionActor zusammengestapelt erweitern.

+0

Keine schlechte Idee, Actor Lifecycle Hooks zu verwenden, aber ich möchte nicht Actor erweitern Ich möchte das Merkmal als Mixin behalten. – davidrpugh

+0

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

+0

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

0

Sie können einen Selbsttyp verwenden, um zu verlangen, dass ein Merkmal nur in Akteure gemischt wird.

trait MyMixin { self: Actor => 
    println(self.path) 
} 

trait MyActor extends Actor with MyMixin 

MyMixin ist nicht ganz ein Schauspieler, aber es kann nur von Klassen erweitert werden, die Akteure sind.

+0

Ich habe dem Mixin eine Anmerkung vom Typ self gegeben, um die Einschränkung zu erzwingen, dass es mit AuctionActor gemischt werden muss (wodurch Actor erweitert wird). Irgendein Grund, "Selbst" anstatt "dieses" zu verwenden? – davidrpugh

+0

Sie können es nennen, was Sie wollen. – Ryan

Verwandte Themen