Как инициализировать актера FSM в Java?

У меня есть следующая конечная машина

примеры пакетов;

import akka.actor.*;

public class ActorOnFsm {
    public static enum State {
    FirstState,
    SecondState,
    ThirdState,
    FourthState
    }

    public static final class ServiceData {

    }


    public class ActorFSM extends AbstractFSM<State, ServiceData> { 
    {
        startWith(FirstState, new ServiceData());
        when(FirstState,
            matchEvent(SomeMessage.class,
                ServiceData.class,
                (powerOn, noData) ->
            goTo(SecondState)
            .replying(SecondState))
            );


        when(SecondState,
            matchEvent(SomeOtherMessage.class,
                ServiceData.class,
                (powerOn, noData) ->
            goTo(ThirdState)
            .replying(ThirdState))
            );

        when(FirstState,
            matchEvent(soemErrorMessage.class,
                ServiceData.class,
                (powerOn, noData) ->
            goTo(FourthState)
            .replying(FourthState))
            );

        initialize();
    }



    }
}

А вот и тест

package examples;

    import akka.testkit.javadsl.TestKit;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    import org.scalatest.junit.JUnitSuite;

    import akka.actor.ActorRef;
    import akka.actor.ActorSystem;
    import akka.actor.Props;


    public class ActorOnFsmTest  extends JUnitSuite {


      static ActorSystem system;

      @BeforeClass
      public static void setup() {
        system = ActorSystem.create();
      }

      @AfterClass
      public static void teardown() {
        TestKit.shutdownActorSystem(system);
        system = null;
      }

      @Test
      public void testIt() {
        new TestKit(system) {{
          final Props props = Props.create(ActorOnFsm.class);
          final ActorRef underTest = system.actorOf(props);
          underTest.tell(new someMessage(), getRef());
          expectMsg(null);

        }};
      }

    }

Это вызывает следующее исключение

java.lang.IllegalArgumentException: unknown actor creator [class examples.ActorOnFsm]
    at akka.actor.IndirectActorProducer$.apply(IndirectActorProducer.scala:62)
    at akka.actor.Props.producer(Props.scala:131)
    at akka.actor.Props.<init>(Props.scala:144)
    at akka.actor.AbstractProps.create(AbstractProps.scala:32)
    at akka.actor.AbstractProps.create$(AbstractProps.scala:32)
    at akka.actor.Props$.create(Props.scala:22)
    at akka.actor.AbstractProps.create(AbstractProps.scala:32)
    at akka.actor.AbstractProps.create$(AbstractProps.scala:32)
    at akka.actor.Props$.create(Props.scala:22)
    at akka.actor.Props.create(Props.scala)
    at examples.ActorOnFsmTest$1.<init>(ActorOnFsmTest.java:33)
    at examples.ActorOnFsmTest.testIt(ActorOnFsmTest.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Каков рекомендуемый способ инициализации актера FSM в java?


person user_mda    schedule 20.03.2018    source источник
comment
Это вопрос или дамп кода? Что вы пробовали?   -  person Michael    schedule 20.03.2018
comment
Это дамп из документации, как я пытаюсь его изучить, надеясь, что пример работает.   -  person user_mda    schedule 20.03.2018
comment
ссылка может быть единственным полным примером, который я нашел в java   -  person user_mda    schedule 20.03.2018
comment
Возможный дубликат Инициализация актера с реквизитами   -  person Jeffrey Chung    schedule 22.03.2018


Ответы (1)


Вы пытаетесь создать актера final Props props = Props.create(ActorOnFsm.class); окончательный ActorRef под тестом = system.actorOf (реквизит);

Но ActorOnFsm не является настоящим актером, не так ли? Вы забыли расширить его от AbstractActor?

person Carlos    schedule 20.03.2018
comment
Он не расширяет AbstractActor, если посмотреть на документ здесь doc.akka. io/docs/akka/current/fsm.html#overview, учитывая что как создать актора для теста? - person user_mda; 20.03.2018
comment
Я думаю, я спрашиваю, как проверить актера FSM? - person user_mda; 20.03.2018
comment
или как мне отправить сообщение этому актеру? - person user_mda; 20.03.2018