Я пытаюсь использовать среду конечного автомата Akka для моего случая использования.Я работаю в системе, которая обрабатывает запрос, который проходит через различные состояния.
Запрос здесь - это имя приложения, которое необходимо развернуть вместе с приложением, от которого оно зависит:
Request for application A -> A is in a QUEUED state
Discover A's dependency B -> B is in a QUEUED state
B is being processed -> B is in a PROCESSING STATE
A is being processed -> A is in a PROCESSING STATE
B is processed -> B is in a DONE state
A is processed -> A is in a DONE state
Для этого я инициализирую конечный автомат во время открытия.Итак, FSM A
создается при поступлении запроса, FSM B
инициализируется при обнаружении B
от одного из участников.
Я инициализирую и передаю экземпляр FSM ввсе действующие лица и одновременно tell
ФСМ об операциях, выполняемых с данными, чтобы конечный автомат перешел в правильное состояние?
Вот соответствующая часть конечного автомата:
when(QUEUED, matchEvent(requestAccepted.class, MyApp.class,
(requestAccepted, service) ->
goTo(PROCESSING).replying(PROCESSING)));
when(PROCESSING, matchEvent(completed.class, MyApp.class,
(completed, service) -> goTo(DONE).replying(DONE)));
// During transitions, save states in the database.
onTransition(matchState(PROCESSING, DONE, () -> {
nextStateData().setServiceStatus(DONE);
databaseWriter.tell(nextStateData(), getSelf());
А вот пример одного из действующих лиц, обрабатывающих запрос:
ProcessingActor extends AbstractActor {
@Override
public void onReceive(Object message) throws Throwable {
if (message instanceof processApplication) {
// process the app
// Initialize FSM for the Application
FSM myFSM = Props.create(MYFSM.class);
myFSM.tell( new completed(processApplication.app)
}
Это правильный способ инициализации конечного автомата и его использования?Или инициализация должна произойти в конструкторе ProcessingActor
?Но в этом случае не будет один конечный автомат для приложения (данных).