Как снова вызвать Invoker в том же состоянии в Apache Commons SCXML

Я использовал Apache Commons SCXML для поддержки конечного автомата в моем проекте. Мы использовали Invoker для выполнения некоторых действий, как только выполняется переход в состояние, для которого определен invoker.

Проблема наступает, когда invoker вызывается дважды из одного и того же состояния. Например, из состояния "A" вызывается событие "TEMP", затем оно переходит в состояние "B". И как только он входит в состояние "B", вызывается invoker, и вызывается метод обратного вызова invoke() класса Invoker.

<state id="A">
    <transition event="TEMP" target="B"></transition>
</state>

<state id="B">
    <invoke src="INVOKER" targettype="invoker-req">
        <transition event="FAIL" target="A"></transition>
        <transition event="SUCC" target="C"></transition>
    </invoke>
</state>

Проблема наступает, когда событие "TEMP" снова запускается из состояния A, а затем Invoker не вызывается. Метод invoke() никогда не вызывается снова. Можно ли вызвать вызывающего только один раз?

Пожалуйста, дайте мне знать, как я могу снова вызвать invoker/invoke(). Я не получаю много помощи в Интернете.

Заранее спасибо.

1 ответ

Я не уверен в деталях реализации apache-commons, но спецификация SCXML требует, чтобы вызывающие устройства вызывались, когда их содержащее состояние находилось в активной конфигурации в конце макроса, и не вызывались, когда этого состояния больше нет в активной конфигурации. в конце макрошаг. Таким образом, может быть только один запущенный экземпляр invoker, независимо от того, из какого состояния вы пришли.

Однако вы можете запустить вызывающий в родительском состоянии и отправить события с его идентификатором в виде #_target в блоке onentry. Вы можете отправить столько событий, сколько захотите, и переместить код приложения из экземпляра инициаторов в прием события.

Другие вопросы по тегам