2015-05-18 3 views
0

Я пытаюсь реализовать поток управления с помощью Apache scxml. Мои переходы в состоянии соответствуютПереход состояния из состояния в scxml

<scxml initial="State1"> 

    <state id = "State1"><transition event="event1" target="State2"></state> 
    <state id = "State2"> 
     <transition event="event2" target="State3"> 
     <transition event="event3" target="State4"> 
    </state> 
    <state id = "State3"> 
     <transition event="event4" target="State2"> 
    </state> 

    <state id = "State4"> 
     <transition event="event5" target="State2"> 
    </state> 

    <state id = "State5"><transition target="State1"> 
</scxml> 

как конечный автомат работает нормально и работает без проблем. Но у меня есть несколько требований, по которым я столкнулся проблемы в

  1. Я должен проверить внешнее событие в каждом государстве, и если это событие является истинным, я должен идти до последнего состояния цикла. что было бы лучшим способом добиться этого?

  2. Вполне возможно, что, когда я нахожусь в state2 я могу пойти в state4 или state5 через state3. Возможно ли, что я смогу запустить событие или изменить состояние с state3 после проверки условий, чтобы перейти на state4 или state5?

Оба вышеуказанных вопроса, похоже, имеют одно и то же решение, но я не могу найти оптимальный способ их реализации.

+0

Обратите внимание, что ваш SCXML Недопустимо: вы используете неправильную заглавную строку для вашего атрибута 'initial', и у вас есть' State52' и 'State54' в качестве целей, которых не существует. Я ценю, что вы разбираете свой пример, но, пожалуйста, постарайтесь убедиться, что он действителен, чтобы мы могли отличать проблемы, которые могут возникнуть из-за неправильной разметки по сравнению с концептуальными проблемами. – Phrogz

+0

Спасибо, что указали, что из Phrogz отредактировал и исправил ошибку – Agarwal

ответ

0

Проверьте внешнее событие [...], и если это событие истинно [...], перейдите к последнему состоянию цикла.

Вы можете сделать это наиболее элегантно, обернув все состояния в родительской оболочке и перейдя оттуда. Например:

<scxml xmlns="http://www.w3.org/2005/07/scxml" initial="state1"> 
    <state id='all'> 
    <!-- this will always be tested, no matter which child state you are in --> 
    <transition event="externalevent" target="state5" /> 
    <state id="state1"><!-- ... --></state> 
    <state id="state2"><!-- ... --></state> 
    <state id="state3"><!-- ... --></state> 
    <state id="state4"><!-- ... --></state> 
    <state id="state5"><!-- ... --></state> 
    </state> 
</scxml> 

Вполне возможно, что, когда я нахожусь в state2 я могу пойти в state4 или state5 через state3?

Кажется, что плохой шаблон вы описываете, но да, это возможно. Вам нужно установить флаг на пути в состояние и использовать этот флаг для немедленного перехода. Например, с помощью простого Lua datamodel (не поддерживается Apache SCXML, но используемый здесь для ясности):

<datamodel> 
    <data id="bounceTo" expr="-1" /> 
</datamodel> 

<state id="state2"> 
    <transition event="bounce-3-4" target="state3"> 
    <assign location="bounceTo" expr="4" /> 
    </transition> 
    <transition event="bounce-3-5" target="state3"> 
    <assign location="bounceTo" expr="5" /> 
    </transition> 
</state> 

<state id="state3"> 
    <transition cond="bounceTo==4" target="state4"> 
    <assign location="bounceTo" expr="-1" /> 
    </transition> 
    <transition cond="bounceTo==5" target="state5"> 
    <assign location="bounceTo" expr="-1" /> 
    </transition> 
</state> 

Установка, тестирование и очистка значения данных в Apache SCXML находится за пределами моего понимания.

Однако, я должен спросить, ПОЧЕМУ вы хотите это сделать. Кажется, что было бы гораздо лучше, на мой взгляд, для репликации ввода или выхода из действия, которые вы хотите от предположительно state3на самих переходах, и пусть эти переходы непосредственно целевое состояние 4 или 5.