2016-07-19 11 views
1

抽象的なAkka俳優の擬似コードに続いて、テストケースを書くのに助けてもらえますか?抽象Akka俳優の監督戦略のテストケースを書く方法

問題私は、監督戦略をその子に適用するのではなく、親アクターがすべての監督戦略メッセージ(テストケースの一部として送信)を消費していることに直面しています。

親抽象アクターは子供を作成します。親クラスを拡張

Abstract class Parent extends UntypedActor { 

    String name; 
    int noOfChildActors; 
    //this set is used to manage the children i.e noOfChildActors = children.size() 
    Set<ActorRef> children;  

    public Parent(String name, int noOfChildActors, Props childProps){ 
    this.name=name; 
    this.noOfChildActors = noOfChildActors; 
    createChildern(childProps); 
    } 

    public void createChildern(Props props){ 
    for(int i = 0 ; i< no_of_child_actors;i++) 
    final ActorRef actor = getContext().actorOf(props, "worker"+i); 
    getContext().watch(actor); 
    children.add(actor); 
    } 

    @Override 
    public void onReceive(final Object message) { 
    //actor functionalities goes here. 
    } 

    @Override 
    public SupervisorStrategy supervisorStrategy() { 
     return defaultSupervisorStrategy(); 
    } 

    private SupervisorStrategy defaultSupervisorStrategy() { 
     return new AllForOneStrategy(-1, Duration.Inf(), new Strategy()); 
    } 

    private class Strategy implements Function<Throwable, Directive> { 
    @Override 
     public Directive apply(final Throwable t) { 
    //my own strategies. 
    } 
    } 
//child managing methods. 
//Abstract functions 
} 

子クラス

class Child extends Parent{ 

    String name; 

    public static Props props(final String name, int noOfChildActors, Props childProps) { 
     return Props.create(Child.class, name, noOfChildActors, childProps); 
    } 

    public Child(String name, int noOfChildActors, Props childProps){ 
    super(name, noOfChildActors, childProps); 
    } 

//followed by my abstract function definition 
} 

//テストケース

private static final FiniteDuration WAIT_TIME = Duration.create(5, TimeUnit.SECONDS); 
    JavaTestKit sender = new JavaTestKit(system); 
    final Props props = Child.Props("name", 3, Props.empty()); 
    ActorRef consumer = system.actorOf(props, "test-supervision"); 
    final TestProbe probe = new TestProbe(system); 
    probe.watch(consumer); 
    consumer.tell(ActorInitializationException.class, sender.getRef()); 
    probe.expectMsgClass(WAIT_TIME, Terminated.class); 

答えて

1

アッカでparent概念は、クラス階層内の親が、ツリー内の親ではありません実際のサンプルコードでは、クラスChildは実際にはクラスParentの子ではありません。通常の場合、子アクターは親のクラスを拡張しません。

アクターは、getContext().actorOf()を使用して子を開始することによって親になることができます。この後、子の未処理の例外は親の監督ロジックで終了します。

もっと読むここ http://doc.akka.io/docs/akka/2.4/general/actor-systems.html#Hierarchical_Structure、ここドキュメントでhttp://doc.akka.io/docs/akka/2.4/java/fault-tolerance.html

+0

おかげでジョン、この質問に答えるため。私はAkkaの親はOOモデルと同じではないことを理解しています。私が提供している疑似コードはAPIです。抽象クラス 'Parent'は、子アクター(Kafkaクラスターのプロデューサーとコンシューマー)を作成します。あなたは、それに子供である '親 'の監督をテストする方法を助けることができますか? –

+0

docsのこのセクションを見てください:http://doc.akka.io/docs/akka/2.4/java/testing.html#Testing_parent-child_relationshipsそれはあなたにいくつかのアイデアを与える必要があります – johanandren

関連する問題