commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Woonsan Ko (JIRA)" <j...@apache.org>
Subject [jira] [Resolved] (SCXML-167) SimpleScheduler removes wrong Timer
Date Thu, 28 Nov 2013 06:47:35 GMT

     [ https://issues.apache.org/jira/browse/SCXML-167?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Woonsan Ko resolved SCXML-167.
------------------------------

    Resolution: Fixed

Fixed.

Thank you very much for reporting this and giving a solution, Maikel Linke!

Cheers,

Woonsan

> SimpleScheduler removes wrong Timer
> -----------------------------------
>
>                 Key: SCXML-167
>                 URL: https://issues.apache.org/jira/browse/SCXML-167
>             Project: Commons SCXML
>          Issue Type: Bug
>    Affects Versions: 0.5, 0.6, 0.7, 0.8, 0.9
>         Environment: supersteps activated
>            Reporter: Maikel Linke
>            Assignee: Woonsan Ko
>              Labels: cancel, delay, patch, send, timing
>             Fix For: 2.0
>
>   Original Estimate: 1h
>  Remaining Estimate: 1h
>
> The SimpleScheduler provides the execution of delayed events. Therefore it uses Timers,
stored in a map under the senderid. The Timers start DelayedEventTasks. These tasks trigger
the given event and then remove their Timer identified by the senderid. In the case that triggering
the event processes a new <send> with the same senderid, the task will remove the wrong
(new) Timer from the internal map. This new Timer is unreachable for canceling now. Of course,
the senderid should be unique, but cannot be assigned by an expression and the following example
fails:
>     <state id="Timer">
>         <onentry>
>             <send event="'tick'" sendid="sendtick" delay="'1s'"/>
>         </onentry>
>         <transition event="tick" target="Timer"/>
>         <transition event="stop" target="NoTimer"/>
>         <onexit>
>             <cancel sendid="sendtick"/>
>         </onexit>
>     </state>
> The solution is very simple: just remove the Timer from the Map first and then trigger
the event.
> So this code:
>         public void run() {
>             try {
>                 executor.triggerEvent(new TriggerEvent(event,
>                     TriggerEvent.SIGNAL_EVENT, payload));
>             } catch (ModelException me) {
>                 log.error(me.getMessage(), me);
>             }
>             timers.remove(sendId);
>             if (log.isDebugEnabled()) {
>                 log.debug("Fired event '" + event + "' as scheduled by "
>                     + "<send> with id '" + sendId + "'");
>             }
>         }
> Changes to:
>         public void run() {
>             timers.remove(sendId);
>             try {
>                 executor.triggerEvent(new TriggerEvent(event,
>                     TriggerEvent.SIGNAL_EVENT, payload));
>             } catch (ModelException me) {
>                 log.error(me.getMessage(), me);
>             }
>             if (log.isDebugEnabled()) {
>                 log.debug("Fired event '" + event + "' as scheduled by "
>                     + "<send> with id '" + sendId + "'");
>             }
>         }
> It should not brake any logic applied to the internal private Map timers.



--
This message was sent by Atlassian JIRA
(v6.1#6144)

Mime
View raw message