Я пытаюсь использовать механизм конечной автомата Akka для моего варианта использования. Я работаю над системой, которая обрабатывает запрос, который проходит через различные состояния.
Запрос здесь - это имя приложения, которое необходимо развернуть вместе с приложением, от которого оно зависит:
Request for application A -> A is in a QUEUED state
Discover A 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
B
FSM инициализируется, когда B
обнаружен у одного из актеров.
Я инициализирую и передаю экземпляр FSM всем действующим лицам и в то же время tell
FSM об операциях, выполняемых с данными, чтобы конечный автомат находился в правильном состоянии?
Вот соответствующая часть конечного автомата:
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
? Но в этом случае не было бы одного конечного автомата для каждого приложения (данных).