Обновление данных в конечном автомате

Я использую структуру FSM с AKKA, используя свой Java API для управления переходами состояний. Вот соответствующая часть конечной машины

     when(QUEUED,
            matchEvent(Exception.class, Service.class,
                (exception, dservice) -> goTo(ERROR)
                    .replying(ERROR)));


        // TODO:It seems missing from the DOC that to transition from a state , every state must be
        // listed

        // a service is in a errored state
        when(ERROR,
            matchAnyEvent((state, data) -> stay().replying("Staying in Errored state")));

        onTransition(matchState(QUEUED, ERROR, () -> {
   // Update the Service object and save it to the database


        }));

Это работает так, как ожидалось, и с актером происходят правильные изменения состояния. В блоке onTansition() я хочу обновить объект службы, который в данном случае является данными конечного автомата, что-то вроде следующего

Service.setProperty(someProperty)
dbActor.tell(saveService);

Это возможно? Правильно ли я использую эту структуру?

Я думаю, что смог сделать что-то вроде следующего

 onTransition(matchState(QUEUED,ERROR, () -> {
      nextStateData().setServiceStatus(ERROR);
      // Get the actual exception message here to save to the database
      databaseWriter.tell(nextStateData(), getSelf());

    }));

Как мне проверить данные, которые изменились в результате этого перехода?

Тест выглядит так

   @Test
      public void testErrorState() {
        new TestKit(system) {
          {
            TestProbe probe = new TestProbe(system);
            final ActorRef underTest = system.actorOf(ServiceFSMActor.props(dbWriter));
            underTest.tell(new Exception(), getRef());
            expectMsgEquals(ERROR); // This works
           // How do I make sure the data is updated here as part of the OnTransition declaration??

          }
        };
      }

person user_mda    schedule 29.03.2018    source источник


Ответы (1)


Вы определили зонд в тесте, но не используете его. Поскольку актор FSM отправляет обновленное состояние актору записи базы данных, вы можете проверить обновленное состояние, заменив актор записи базы данных зондом:

new TestKit(system) {{
  final TestProbe probe = new TestProbe(system);

  final ActorRef underTest = system.actorOf(ServiceFSMActor.props(probe.ref()));
  underTest.tell(new Exception(), getRef());
  expectMsgEquals(ERROR);

  final Service state = probe.expectMsgClass(Service.class);
  assertEquals(ERROR, state.getServiceStatus());
}};
person Jeffrey Chung    schedule 02.04.2018