2016-05-19 2 views
0

Я пытался создать конфигурацию для диаграммы состояния, прилагаемой State diagram. Проблема в том, что я не смог зарегистрировать действия входа в состояния в регионах внутри вилки. т.е. для состояний S41, S41E, S42, S42E.Нужна помощь для создания конфигурации конечного автомата

Конфигурация выглядит, как показано ниже.

Builder builder = StateMachineBuilder.builder();

builder.configureConfiguration() 
    .withConfiguration() 
     .autoStartup(false).listener(listener()).taskExecutor(taskExecutor()); 

builder.configureStates().withStates().initial("S1", ActionFactory.getAction("S1EntryAction")) 
    .fork("FORK_STATE") 
    .join("JOIN_STATE") 
    .state("S4") 
    .state("S2", ActionFactory.getAction("S2EntryAction"), null) 
    .state("S3", ActionFactory.getAction("S3EntryAction"), null) 
    .state("S5", ActionFactory.getAction("S5EntryAction"), null) 
    .state("S6", ActionFactory.getAction("S6EntryAction"), null) 
    .state("S7", ActionFactory.getAction("S7EntryAction"), null) 
    .and().withStates().parent("S4").initial("S41").end("S41E") 
    .and().withStates().parent("S4").initial("S42").end("S42E"); 

    builder.configureTransitions() 
     .withExternal().source("S1").target("S2") 
     .and().withExternal().source("S2").target("S3") 
     .and().withExternal().source("S3").target("FORK_STATE") 
     .and().withFork().source("FORK_STATE").target("S4") 
     .and().withExternal().source("S41").target("S41E") 
     .and().withExternal().source("S42").target("S42E") 
     .and().withJoin().source("S4").target("JOIN_STATE") 
     .and().withExternal().source("JOIN_STATE").target("S5") 
     .and().withExternal().source("S5").target("S6") 
     .and().withExternal().source("S6").target("S7"); 

return builder.build(); 

Еще одна помощь. В приведенной выше конфигурации состояния машины каждое состояние имеет вложенные состояния.

S1 имеет шаг0 и старт1. Оба ортогональны step0 имеет состояние task1, а задача 2 step1 имеет задачу состояний 3, а задача 4 step0 должна быть завершена, когда задача 1 параллельных областей заканчивается ее exexution. Шаг 1 должен быть завершен, когда задача 3 параллельных областей и задача 4 заканчивают его exexution. Фактически все четыре состояния task1, task2, task3, task4 должны выполняться параллельно

S1 завершен, если завершены шаги step0 и step2.

переходов от S1 к S2 будут происходить только после завершения всех параллельных штатов т.е. (step0 (task1 & задачи 2) и step2 (Task3 и task4))

Также обратите внимание, что S1 является начальным состоянием моей конфигурации.

Я обновил конфигурацию в таких штатах, как ниже

.and().withStates().parent("S1") 
      .initial("Step0") 
       .and().withStates().parent("Step0") 
        .initial("task1", dummyAction1()) 
       .and().withStates().parent("Step0") 
        .initial("task2", dummyAction2()) 

.and().withStates().parent("S1") 
      .initial("Step1") 
       .and().withStates().parent("Step1") 
        .initial("task3", dummyAction3()) 
       .and().withStates().parent("Step1") 
        .initial("task4", dummyAction4()) 

.and().withStates().parent("S2") 
      .initial("Step01") 
       .and().withStates().parent("Step01") 
        .initial("task5", dummyAction3()) 
       .and().withStates().parent("Step01") 

        .initial("task6", dummyAction4()) 

.and().withStates().parent("S2") 
      .initial("Step11") 
       .and().withStates().parent("Step11") 
        .initial("task7", dummyAction3()) 
       .and().withStates().parent("Step11") 
        .initial("task8", dummyAction4()) 

Как настроить переход от S1 к S2? (S1 - начальное состояние, а S1to S2 должно выполняться после завершения всех параллельных задач в S1 (т. Е. Task1, task2, task3, task4).

+0

Прежде чем я буду рассматривать это дальше, попытались ли вы определить действие для 'S41' с' .initial ("S41"). State ("S41", null, null) 'или с возможным' .state (" S41 ", null, null)' на родительском уровне? Также в версии 1.1.x сделано много исправлений, которые идут на следующей неделе. –

+0

Спасибо! это сработало. – user2330825

+0

Я обновил вопрос. Цените любую помощь – user2330825

ответ

0

Ваш вопрос был немного запутанным, когда вы его модифицировали, но я быстро испытания что-то с использованием UML (как это проще и быстрее изготовить что-то вместе).

Я толкнул это в GitHub ssm-example1. Является ли диаграмма состояний есть то, что вы пытаетесь гоняться здесь?

При запуске его вы получаете заказ из записей состояния и соединений должно обрабатывать этот поток: synchronized. Чтобы выполнить что-то между S1 и S2, это может быть легко r, чтобы добавить дополнительное состояние в середине и выполнить там материал. Может быть полезно иметь возможность добавлять действие к исходящей вершине из JOIN (s), но я не уверен, является ли он законным и, вероятно, не работает с текущей версией ssm (1.1.0.RELEASE).

Мне нужно попробовать, как он ведет себя с async-исполнителем как ssm по умолчанию для синхронизации исполнителя. Он пытается использовать соединения (которые не должны получать обратные вызовы в прослушивателях, что является ошибкой, которую мне нужно исправить).

Без явных вилок (управляемая запись) записи состояния будут, теоретически, возвращаться к логике ввода по умолчанию.

Я еще не добавлял никаких действий, но это были бы нормальные действия входа/выхода в состояние. В вашем примере, когда вы связали действие с .initial(), это не нормальная запись состояния.Действие с initial() - это, в основном, начальное действие перехода, которое выполняется с логикой ввода по умолчанию (которая теоретически не будет выполняться, если произойдет прямой вход в не начальное состояние).

+0

Спасибо за этот быстрый ответ на примере. Мы пытаемся построить конфигурацию с помощью построителя, читая имена состояний, переходы из внешнего источника данных. Можете ли вы, пожалуйста, помочь мне получить ту же конфигурацию ssm-sample1, используя StateMachineBuilder (т. Е. Не использовать uml или papyrus). – user2330825

+0

Также, если это возможно, при переходе на forking во все родительские состояния, имеющие более чем одну область – user2330825

Смежные вопросы