Message:
A new issue has been created in JIRA.
---------------------------------------------------------------------
View the issue:
http://jira.opensymphony.com/secure/ViewIssue.jspa?key=WF-196
Here is an overview of the issue:
---------------------------------------------------------------------
Key: WF-196
Summary: Auto action is executed unlimted number of times after split
Type: Bug
Status: Assigned
Priority: Critical
Project: OSWorkflow
Assignee: Patrick Lightbody
Reporter: Axel Mueller
Created: Sat, 16 Aug 2003 2:44 PM
Updated: Sat, 16 Aug 2003 2:44 PM
Environment: latest CVS version (sourceforge) of OSWF
Description:
If the unconditional result of a split transitions to a step/status combo with a auto-action, the auto-action gets executed an unlimted number of times causing a loop.
In the workflow definition below this is action 1101.
If split 10 has only one unconditional result (regardless if it is step 11/Vorgemerkt action 1101 is executed once. The same applies for step 12/Vorgemerkt where action 1201 is executed once. If split 10 has two unconditional results (as shown below) action 1101 get executed again and again and again ...
2003-08-16 21:26:57,812 DEBUG [com.opensymphony.workflow.AbstractWorkflow.createNewCurrentStep(AbstractWorkflow.java:824)]-Outcome: stepId=11, status=${status}, owner=, actionId=1101, currentStep=11
2003-08-16 21:27:49,941 DEBUG [com.opensymphony.workflow.AbstractWorkflow.createNewCurrentStep(AbstractWorkflow.java:824)]-Outcome: stepId=11, status=${status}, owner=, actionId=1101, currentStep=11
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE workflow PUBLIC "-//OpenSymphony Group//DTD OSWorkflow 2.5//EN" "http://www.opensymphony.com/osworkflow/workflow.dtd">
<!-- $Id: geschaeftsverarbeitung.xml,v 1.4 2003/08/15 18:35:24 mueller Exp $ -->
<workflow>
<initial-actions>
<action id="1" name="Geschäftsverarbeitungsworkflow erzeugen">
<restrict-to/>
<results>
<unconditional-result old-status="Nicht vorhanden" split="10" owner="Geschaeftsverarbeitung"/>
</results>
</action>
</initial-actions>
<steps>
<step id="11" name="EGL Kursquelle">
<actions>
<action id="1101" name="EGL-Kurse laden vormerken" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Vorgemerkt</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Wartend", "Fertig" -->
<function type="class">
<arg name="class.name">ch.gbs.mex.domain.workflow.WorkflowActionScheduler</arg>
<arg name="workflowActionId">1102</arg>
<arg name="workflowTyp">2</arg>
<arg name="startTimeHour">11</arg>
<arg name="startTimeMinute">16</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Vorgemerkt" status="${status}" step="11"/>
</results>
</action>
<action id="1102" name="EGL-Kurse laden">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Wartend</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.EglExcelKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Wartend" status="${status}" step="11"/>
</results>
</action>
<action id="1103" name="EGL-Kurse laden Restart">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fehler</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.EglExcelKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Fehler" status="${status}" step="11"/>
</results>
</action>
<action id="1104" name="EGL-Kurse laden Ende" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fertig</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Fertig" join="15"/>
</results>
</action>
</actions>
</step>
<step id="12" name="EEX Kursquelle">
<actions>
<action id="1201" name="EEX-Kurse laden vormerken" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Vorgemerkt</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Wartend", "Fertig" -->
<arg name="class.name">ch.gbs.mex.domain.workflow.WorkflowActionScheduler</arg>
<arg name="workflowActionId">1202</arg>
<arg name="workflowTyp">2</arg>
<arg name="startTimeHour">11</arg>
<arg name="startTimeMinute">16</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Vorgemerkt" status="${status}" step="12"/>
</results>
</action>
<action id="1202" name="EEX-Kurse laden">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Wartend</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.EexHttpKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Wartend" status="${status}" step="12"/>
</results>
</action>
<action id="1203" name="EEX-Kurse laden Restart">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fehler</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.EexHttpKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Fehler" status="${status}" step="12"/>
</results>
</action>
<action id="1204" name="EEX-Kurse laden Ende" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fertig</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Fertig" join="15"/>
</results>
</action>
</actions>
</step>
<step id="13" name="OMEL Kursquelle">
<actions>
<action id="1301" name="OMEL-Kurse laden vormerken" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Vorgemerkt</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Wartend", "Fertig" -->
<arg name="class.name">ch.gbs.mex.domain.workflow.WorkflowActionScheduler</arg>
<arg name="workflowActionId">1302</arg>
<arg name="workflowTyp">2</arg>
<arg name="startTimeHour">11</arg>
<arg name="startTimeMinute">16</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Vorgemerkt" status="${status}" step="13"/>
</results>
</action>
<action id="1302" name="OMEL-Kurse laden ">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Wartend</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.OmelHttpKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Wartend" status="${status}" step="13"/>
</results>
</action>
<action id="1303" name="OMEL-Kurse laden Restart">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fehler</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.OmelHttpKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Fehler" status="${status}" step="13"/>
</results>
</action>
<action id="1304" name="OMEL-Kurse laden Ende" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fertig</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Fertig" join="15"/>
</results>
</action>
</actions>
</step>
<step id="14" name="Theoretische Kurse">
<actions>
<action id="1401" name="Theoretische Kurse laden">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Wartend</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.Mex2DBKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Wartend" status="${status}" step="14"/>
</results>
</action>
<action id="1402" name="Theoretische Kurse laden Restart">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fehler</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Fertig", "Fehler" -->
<arg name="class.name">ch.gbs.mex.domain.produkt.Mex2DBKursQuellenWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Fehler" status="${status}" step="14"/>
</results>
</action>
<action id="1403" name="Theoretische Kurse laden Ende" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Fertig</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Fertig" join="15"/>
</results>
</action>
</actions>
</step>
<step id="20" name="Bewertung">
<actions>
<action id="2001" name="Bewertung" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Läuft</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Unvollständig", "Vollständig" -->
<arg name="class.name">ch.gbs.mex.service.bewertung.GeschaeftsverarbeitungBewertungWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Läuft" status="${status}" step="20"/>
</results>
</action>
<action id="2001" name="Bewertung Restart">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Unvollständig</arg>
</condition>
</conditions>
</restrict-to>
<pre-functions>
<function type="class">
<!-- Der Handler muss den Status des eigenen Steps über die Variable ${status} setzen.
Gültige Werte für ${status} sind: "Unvollständig", "Vollständig" -->
<arg name="class.name">ch.gbs.mex.service.bewertung.GeschaeftsverarbeitungBewertungWorkflowHandler</arg>
</function>
</pre-functions>
<results>
<unconditional-result old-status="Unvollständig" status="${status}" step="20"/>
</results>
</action>
<!-- action id="2003" name="Bewertung Ende" auto="true">
<restrict-to>
<conditions type="AND">
<condition type="class">
<arg name="class.name">com.opensymphony.workflow.util.StatusCondition</arg>
<arg name="status">Vollständig</arg>
</condition>
</conditions>
</restrict-to>
<results>
<unconditional-result old-status="Vollständig" status="Vollständig" step="20"/>
</results>
</action-->
</actions>
</step>
</steps>
<splits>
<split id="10">
<unconditional-result old-status="Split" status="Vorgemerkt" step="11"/>
<unconditional-result old-status="Split" status="Vorgemerkt" step="12"/>
<!-- unconditional-result old-status="Split" status="Vorgemerkt" step="13"/>
<unconditional-result old-status="Split" status="Vorgemerkt" step="14"/-->
</split>
</splits>
<joins>
<join id="15">
<conditions type="AND">
<condition type="beanshell">
<arg name="script"><![CDATA[
"Fertig".equals(jn.getStep(11).getStatus())
&& "Fertig".equals(jn.getStep(12).getStatus())
&& "Fertig".equals(jn.getStep(13).getStatus())
&& "Fertig".equals(jn.getStep(14).getStatus())
]]></arg>
</condition>
</conditions>
<unconditional-result old-status="Join" status="Läuft" step="20" owner="Geschaeftsverarbeitung"/>
</join>
</joins>
</workflow>
---------------------------------------------------------------------
JIRA INFORMATION:
This message is automatically generated by JIRA.
If you think it was sent incorrectly contact one of the administrators:
http://jira.opensymphony.com/secure/Administrators.jspa
If you want more information on JIRA, or have a bug to report see:
http://www.atlassian.com/software/jira
-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
lmpx.com only provides a reader for public news (NNTP) servers. It is not
affiliated with the servers or forums shown here and is not responsible for
the content of articles, which is written by their respective authors.