2017-07-18 17 views
0

一定の有限期間の後に受信タイムアウトをスケジュールするAkkaアクタと混合できる特性を定義したいと思います。ここで私は何をしたいのスケッチ...mixin内のAkka Actorコンテキストへのアクセス

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]] 

がある...しかしcontext.setReceiveTimeoutが呼び出されるとき、私は理解していません。 MyFancyAuctionActorが呼び出されたときにコンストラクタの一部として呼び出されますか?または、それはより早く呼び出されるので、timeoutが定義されていないという事実のために何らかのエラーが発生します。

答えて

0

私はあなたの特性は次のように俳優を拡張していhooks.if俳優のライフサイクルイベントを使用して、スケジュールのトリガーを制御勧め:

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

あなたが俳優のライフサイクルイベントフックの多くにアクセスすることができます例えばpreStart(),postStop()などがあります。

だから、簡単に行うことができます

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? 
    }  
} 

を更新

あなたはスタッカブルミックスイン構造を実装する場合。あなたは上記のようなことをします。

//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) 
    } 
} 

あなたは、あなたのクラスのAuctionActorを積み重ねる性質を多く持つことができます。

+0

俳優のライフサイクルフックを使用するのは悪い考えではありませんが、私はActorを拡張したくありません。私はその特性をmixinとして保持したいと思います。 – davidrpugh

+0

私がスタッキング可能なミックスインに対する最良の実践的アプローチを知っている限り、すべてのミックスインがベース特性を伸ばしているということです。自分のタイプの注釈だけを持つことで、同じ方法を実際にやっていることになります。スタック可能なミックスインを実装するもう一つのやり方があります。答えは – shayan

+0

です。私はスタック可能なアクターのパターンに精通しており、ライブラリでそれを使用しています。多分私はペタンティックであると思うかもしれませんが、私はActorからミックスインが明らかになっているという特徴を持つのが好きではありません。 – davidrpugh

0

自己型を使用して、形質をアクターにのみ混在させることができます。

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

trait MyActor extends Actor with MyMixin 

MyMixinかなり俳優はありませんが、それは唯一の俳優なクラスによって拡張することができます。

+0

私は、アクタを拡張するAuctionActorと混合しなければならないという制約を強制するために、mixinに自己型注釈を提供しました。 「this」ではなく「self」を使用する理由は何ですか? – davidrpugh

+0

あなたは好きなものを呼び出すことができます。 – Ryan