Как снова вызвать 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. Вы можете отправить столько событий, сколько захотите, и переместить код приложения из экземпляра инициаторов в прием события.