cancel
Showing results for 
Search instead for 
Did you mean: 

Parallel & Pooled Workflow

lementree
Champ on-the-rise
Champ on-the-rise
Hi

I want to define a Review/Approve workflow.

Where the Reviewers are from Different Groups.
So I want to start Review workflow parallel to All the groups, then any one of the user from that group will approve/reject the workflow.

Can please any one tell me Processdefinition using BPM Activity.

If even any one knows the solution using JBPM also please tell me.

Thanks in Advance
10 REPLIES 10

jpotts
World-Class Innovator
World-Class Innovator
Have you already read the first edition of the advanced workflows tutorial? It shows how to do a workflow with multiple pooled groups.

Jeff

lementree
Champ on-the-rise
Champ on-the-rise
Hi Jeff,

Thanks for your response,

In that example Marketing and Engineering Reviewes are Pre-Defined groups.

But here the groups are selected from UI using (bpm_groupAssignees). I want start parallel and pooled review task for each group they selected dynamically.


Please help me.

Thanks & Regards

jpotts
World-Class Innovator
World-Class Innovator
The group selection example is out-of-the-box. Go look at the parallelreview_group_processdefinition.xml in $TOMCAT_HOME/webapps/alfresco/WEB-INF/classes/alfresco/workflow.

Jeff

lementree
Champ on-the-rise
Champ on-the-rise
Hi Jeff,

Sorry for My English.

I think you not understood my Issue Clearly.

My Requirement is as below:
For example I am having Multiple groups as Group1 to Group 10
Then In the Workflow I will choose few groups from available groups to Startworkflow.
Then the review Task should be Parallel for all selected groups, One of the pooled user from the each group will approve/reject the Task.

In the Example you gave in the last post is dealing with the same, but in Process Definition The Groups Names(Marketing & Engineering) are hard coded but I want those group names should be Dynamically get from selected groups. I.e I want to start parallel Review for Each group in groupAssignees.


Thanks & Regards

jpotts
World-Class Innovator
World-Class Innovator
I think what you are looking to do is very similar to that process definition. In your case, instead of iterating over the members in the group, you are going to start a task for each group in the list of selected groups, and make sure that you are using a pooled assignment for each of the tasks you spawn.

Jeff

lementree
Champ on-the-rise
Champ on-the-rise
Thanks Jeff,

Yeah I understood it.
 <node name="startreview">
        <action class="org.alfresco.repo.workflow.jbpm.ForEachFork">
            <foreach>#{bpm_groupAssignees}</foreach>
            <var>groupreviewer</var>
        </action>
        <event type="node-enter">
            <script>
                <variable name="wf_approveCount" access="write" />
                <expression>
                    wf_approveCount = 0;
                </expression>
            </script>
        </event>
        <transition name="review" to="review" />
    </node>
<task-node name="review">
        <task name="wf:reviewTask">
            <assignment class="org.alfresco.repo.workflow.jbpm.AlfrescoAssignment">
               <pooledactors>#{groupreviewer}</pooledactors>
            </assignment>
            <event type="task-create">
                <script>
                    if (bpm_workflowDueDate != void) taskInstance.dueDate = bpm_workflowDueDate;
                    if (bpm_workflowPriority != void) taskInstance.priority = bpm_workflowPriority;
                </script>
            </event>
        </task>
        <transition name="approve" to="endreview">
            <script>
                <variable name="wf_approveCount" access="read,write" />
                <expression>
                    wf_approveCount = wf_approveCount +1;
                 </expression>
            </script>
        </transition>
        <transition name="reject" to="endreview" />
    </task-node>

the Similar using Activity
<startEvent id="start"
            activiti:formKey="wf:submitGroupReviewTask" />

        <sequenceFlow id='flow1'
            sourceRef='start'
            targetRef='reviewTask' />

        <userTask id="reviewTask" name="Review Task"
            activiti:formKey="wf:activitiReviewTask">
           <extensionElements>
               <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
                  <activiti:field name="script">
                     <activiti:string>
                        if (typeof bpm_workflowDueDate != 'undefined') task.setVariable('bpm_dueDate', bpm_workflowDueDate);
                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
                     </activiti:string>
                  </activiti:field>
               </activiti:taskListener>
               <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
                  <activiti:field name="script">
                     <activiti:string>
                          execution.setVariable('wf_reviewOutcome', task.getVariable('wf_reviewOutcome'));
                     </activiti:string>
                  </activiti:field>
               </activiti:taskListener>
             
           </extensionElements>
           <potentialOwner>
            <resourceAssignmentExpression>
              <formalExpression>${reviewAssignee.properties.authorityName}</formalExpression>
            </resourceAssignmentExpression>
         </potentialOwner>
         <multiInstanceLoopCharacteristics isSequential="false">
                <loopDataInputRef>bpm_groupAssignees</loopDataInputRef>
                <inputDataItem name="reviewAssignee" />
              </multiInstanceLoopCharacteristics>
        </userTask>

anand6105
Champ in-the-making
Champ in-the-making
Hi,
I want to create my own group Assignee ID. How can I do that?

Regards
Anand.

lementree
Champ on-the-rise
Champ on-the-rise
Hi,
I want to create my own group Assignee ID. How can I do that?

Regards
Anand.

Can you elabarate your question. I am not getting your question.

anand6105
Champ in-the-making
Champ in-the-making
I want to create my own groupAssignee, say tst:groupAssignee in activiti workflow.

Here is the code:

.bpmn file
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:activiti="http://activiti.org/bpmn"
xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC"
xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/bpmn20">
  <process id="Test7" name="Test 7">
    <startEvent id="startevent1" name="Start" activiti:formKey="tst:start"></startEvent>
    <userTask id="usertask1" name="Assign Task" activiti:assignee="${initiator.properties.userName}" activiti:formKey="tst:assignTask">
      <extensionElements>
        <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
          <activiti:field name="script">
            <activiti:string>if (typeof bpm_workflowDueDate != 'undefined') task.dueDate = bpm_workflowDueDate;           
if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
if (typeof bpm_comment != 'undefined') task.setVariable('bpm_comment', bpm_comment);</activiti:string>
          </activiti:field>
        </activiti:taskListener>
        <activiti:taskListener event="complete" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
          <activiti:field name="script">
            <activiti:string>execution.setVariable('bpm_comment', task.getVariable('bpm_comment'));
execution.setVariable('tst_brandID', tst_brandID);
execution.setVariable('tst_brandName', tst_brandName);
execution.setVariable('tst_dobc', tst_dobc);
execution.setVariable('tst_groupAssignee', task.getVariable('tst_groupAssignee'));</activiti:string>
          </activiti:field>
        </activiti:taskListener>
      </extensionElements>
    </userTask>
    <userTask id="usertask2" name="Get Task" activiti:candidateGroups="${tst_groupAssignee.properties.authorityName}" activiti:formKey="tst:getTask"></userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" name="" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <sequenceFlow id="flow2" name="" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <sequenceFlow id="flow3" name="" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_Test7">
    <bpmndi:BPMNPlane bpmnElement="Test7" id="BPMNPlane_Test7">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35" width="35" x="200" y="150"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55" width="105" x="320" y="140"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55" width="105" x="520" y="140"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35" width="35" x="700" y="150"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="235" y="167"></omgdi:waypoint>
        <omgdi:waypoint x="320" y="167"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="425" y="167"></omgdi:waypoint>
        <omgdi:waypoint x="520" y="167"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="625" y="167"></omgdi:waypoint>
        <omgdi:waypoint x="700" y="167"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

model file
<?xml version="1.0" encoding="UTF-8"?>

<model name="tst:testModel" xmlns="http://www.alfresco.org/model/dictionary/1.0">

    <imports>
      <import uri="http://www.alfresco.org/model/dictionary/1.0" prefix="d" />
      <import uri="http://www.alfresco.org/model/bpm/1.0" prefix="bpm" />
    </imports>

    <namespaces>
        <namespace uri="http://www.infosys.com/tst/model/process/1.0"
            prefix="tst" />
    </namespaces>

    <types>
        <type name="tst:start">
            <parent>bpm:startTask</parent>                            
            <mandatory-aspects>
                <aspect>tst:testProps</aspect>
            </mandatory-aspects>
        </type>               
        <type name="tst:assignTask">
            <parent>bpm:workflowTask</parent>
               <mandatory-aspects>
         <aspect>tst:groupAssignee</aspect>
                <aspect>tst:testProps</aspect>
            </mandatory-aspects>           
        </type>
    
    <type name="tst:getTask">
            <parent>bpm:workflowTask</parent>
            <mandatory-aspects>
                <aspect>tst:testProps</aspect>
            </mandatory-aspects>           
        </type>

   </types>
              
   <aspects>
      <aspect name="tst:testProps">
         <properties>
            <property name="tst:brandID">
               <type>d:text</type>
               <mandatory>true</mandatory>
            </property>
            <property name="tst:brandName">
               <type>d:text</type>
               <mandatory>true</mandatory>
            </property>
            <property name="tst:dobc">
               <type>d:date</type>
               <mandatory>true</mandatory>
            </property>      
         </properties>                
      </aspect>
    <aspect name="tst:groupAssignee">
   <associations>
                <association name="tst:groupAssignee">
                    <source>
                        <mandatory>false</mandatory>
                        <many>false</many>
                    </source>
                    <target>
                        <class>cm:authorityContainer</class>
                        <mandatory>false</mandatory>
                        <many>false</many>
                    </target>
                </association>
            </associations>
   </aspect>
   </aspects>   
</model>

and share config file:
<config evaluator="string-compare" condition="activiti$Test7">
      <forms>
         <form>
            <field-visibility>
               <show id="bpm:workflowDescription" />
               <show id="bpm:workflowDueDate" />
               <show id="bpm:workflowPriority" />
               <show id="bpm:comment" />
               <show id="tst:brandID"/>
               <show id="tst:brandName"/>
               <show id="tst:dobc" />
            </field-visibility>
            <appearance>
               <set id="" appearance="title" label-id="workflow.set.general" />
               <set id="info" appearance=""
                  template="/org/alfresco/components/form/2-column-set.ftl" />
               
               <set id="work" appearance="title" label-id="workflow.set.work" />
               <set id="other" appearance="title" label-id="workflow.set.other" />
               <set id="response" appearance="title" label-id="workflow.set.response" />

               <field id="bpm:workflowDescription" label-id="workflow.field.message">
                  <control template="/org/alfresco/components/form/controls/textarea.ftl">
                     <control-param name="style">width: 95%</control-param>
                  </control>
               </field>

               <field id="bpm:workflowDueDate" label-id="workflow.field.due"
                  set="info" />
               <field id="bpm:workflowPriority" label-id="workflow.field.priority"
                  set="info">
                  <control
                     template="/org/alfresco/components/form/controls/workflow/priority.ftl" />
               </field>
               <field id="tst:brandID" label="Brand ID"/>
               <field id="tst:brandName" label="Brand Name"/>
               <field id="tst:dobc" label="Date of Brand Creation"/>

               <field id="bpm:comment" label-id="workflow.field.comment"
                  set="response">
                  <control template="/org/alfresco/components/form/controls/textarea.ftl" />
               </field>
            </appearance>
         </form>
      </forms>
   </config>
<config evaluator="task-type" condition="tst:assignTask">
      <forms>
         <form>
            <field-visibility>
               <show id="message" />
               <show-id="tst:groupAssignee" />
               <show id="bpm:comment" />
               <show id="transitions" />
               <show id="tst:brandID"/>
               <show id="tst:brandName"/>
               <show id="tst:dobc"/>
            </field-visibility>
            <appearance>
               <set id="" appearance="title" label-id="workflow.set.general" />
               <set id="info" appearance=""
                  template="/org/alfresco/components/form/2-column-set.ftl" />
               <set id="groupAssignee" appearance="title" label-id="workflow.set.assignee" />
               
               <set id="work" appearance="title" label-id="workflow.set.work" />
               <set id="other" appearance="title" label-id="workflow.set.other" />
               <set id="response" appearance="title" label-id="workflow.set.response" />


               <field id="message" label-id="workflow.field.message">
                  <control template="/org/alfresco/components/form/controls/info.ftl" />
               </field>
               
               <field id="tst:brandID" label="Brand ID"/>
               <field id="tst:brandName" label="Brand Name"/>
               
               <field id="tst:dobc" label="Date of Brand Creation"/>
               <field id="tst:groupAssignee" label-id="workflow.field.assign_to"
                  set="groupAssignee" />
               
               <field id="bpm:comment" label-id="workflow.field.comment"
                  set="response">
                  <control template="/org/alfresco/components/form/controls/textarea.ftl" />
               </field>
               <field id="transitions" set="response" />

            </appearance>

         </form>
      </forms>
   </config>   

<config evaluator="task-type" condition="tst:getTask">
      <forms>
         <form>
            <field-visibility>
               <show id="message" />
               <show id="bpm:comment" />
               <show id="transitions" />
               <show id="tst:brandID"/>
               <show id="tst:brandName"/>
               <show id="tst:dobc"/>
            </field-visibility>
            <appearance>
               <set id="" appearance="title" label-id="workflow.set.general" />
               <set id="info" appearance=""
                  template="/org/alfresco/components/form/2-column-set.ftl" />
               
               <set id="work" appearance="title" label-id="workflow.set.work" />
               <set id="other" appearance="title" label-id="workflow.set.other" />
               <set id="response" appearance="title" label-id="workflow.set.response" />


               <field id="message" label-id="workflow.field.message">
                  <control template="/org/alfresco/components/form/controls/info.ftl" />
               </field>
               
               <field id="tst:brandID" label="Brand ID"/>
               <field id="tst:brandName" label="Brand Name"/>
               
               <field id="tst:dobc" label="Date of Brand Creation"/>
               
               <field id="bpm:comment" label-id="workflow.field.comment"
                  set="response">
                  <control template="/org/alfresco/components/form/controls/textarea.ftl" />
               </field>
               <field id="transitions" set="response" />

            </appearance>

         </form>
      </forms>
   </config>   

I have gone through the previous post of creating assignee, but they are for jbpmn workflows. Currently it is not working in my case
I am getting the following error:
Nov 15, 2012 2:14:25 PM org.apache.catalina.startup.SetContextPropertiesRule begin
WARNING: [SetContextPropertiesRule]{Context} Setting property 'debug' to '0' did not find a matching property.
Nov 15, 2012 2:14:51 PM org.apache.catalina.startup.HostConfig deployWAR
INFO: Deploying web application archive C:\Alfresco\tomcat\webapps\alfresco.war
Nov 15, 2012 2:15:29 PM org.apache.catalina.core.StandardContext addApplicationListener
INFO: The listener "org.apache.myfaces.webapp.StartupServletContextListener" is already configured for this context. The duplicate definition has been ignored.
Nov 15, 2012 2:18:21 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Error listenerStart
Nov 15, 2012 2:18:21 PM org.apache.catalina.core.StandardContext startInternal
SEVERE: Context [/alfresco] startup failed due to previous errors
Nov 15, 2012 2:18:22 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
Nov 15, 2012 2:45:00 PM org.apache.catalina.loader.WebappClassLoader loadClass
INFO: Illegal access: this web application instance has been stopped already.  Could not load org.bouncycastle.jce.provider.symmetric.AES$ECB.  The eventual following stack trace is caused by an error thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access, and has no functional impact.
java.lang.IllegalStateException
   at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1600)
   at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1559)
   at java.security.Provider$Service.getImplClass(Provider.java:1279)
   at java.security.Provider$Service.newInstance(Provider.java:1237)
   at javax.crypto.Cipher.chooseProvider(Cipher.java:845)
   at javax.crypto.Cipher.init(Cipher.java:1348)
   at sun.security.ssl.CipherBox.<init>(CipherBox.java:175)
   at sun.security.ssl.CipherBox.newCipherBox(CipherBox.java:208)
   at sun.security.ssl.CipherSuite$BulkCipher.newCipher(CipherSuite.java:467)
   at sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:507)
   at sun.security.ssl.CipherSuite$BulkCipher.isAvailable(CipherSuite.java:485)
   at sun.security.ssl.CipherSuite.isAvailable(CipherSuite.java:190)
   at sun.security.ssl.SSLContextImpl.getApplicableCipherSuiteList(SSLContextImpl.java:342)
   at sun.security.ssl.SSLContextImpl.getDefaultCipherSuiteList(SSLContextImpl.java:293)
   at sun.security.ssl.SSLSocketImpl.init(SSLSocketImpl.java:576)
   at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:494)
   at sun.security.ssl.SSLServerSocketImpl.accept(SSLServerSocketImpl.java:313)
   at org.apache.tomcat.util.net.jsse.JSSESocketFactory.acceptSocket(JSSESocketFactory.java:182)
   at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:216)
   at java.lang.Thread.run(Thread.java:722)
Getting started

Tags


Find what you came for

We want to make your experience in Hyland Connect as valuable as possible, so we put together some helpful links.