[rules-users] (no subject)

Alberto R. Galdo argaldo at gmail.com
Mon Feb 13 09:16:31 EST 2012


We're using 5.2.0 final here.

What we are also observing is that whenever a process instance reaches a
businessruletask node the rule gets fired a number of times equal to the
number of instantiated processes even if any of those processes didn't
reach the bussinessruletask node.

Does this means that whenever a businessruletask is reached in any of the
current process instance, the rule gets fired for *all* the instances of
the process and subsequent businessruletask nodes won't fire anything?



2012/2/13 Esteban Aliverti <esteban.aliverti at gmail.com>

> I had some tests working fine in jbpm 5.1 but failing in 5.3 because of
> this same reason. I'm not sure if this is this is a regression bug or if
> there is a deliberated change in the behavior.
> Maybe someone in the jbpm dev team can shed some light here.
>
> Best Regards,
>
> XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
>
> Esteban Aliverti
> - Developer @ http://www.plugtree.com
> - Blog @ http://ilesteban.wordpress.com
>
>
> 2012/2/13 Alberto R. Galdo <argaldo at gmail.com>
>
>>
>> According to the documentation:
>>
>> "Rule constraints do not have direct access to variables defined inside
>>> the process.
>>> It is however possible to refer to the current process instance inside a
>>> rule constraint,
>>> by adding the process instance to the Working Memory and matching for
>>> the process instance in your rule constraint.
>>> We have added special logic to make sure that a variable processInstance
>>> of type WorkflowProcessInstance
>>> will only match to the current process instance and not to other process
>>> instances in the Working Memory.
>>> Note that you are however responsible yourself to insert the process
>>> instance into the session and,
>>> possibly, to update it, for example, using Java code or an on-entry or
>>> on-exit or explicit action in your process.
>>> The following example of a rule constraint will search for a person with
>>> the same name as the value stored in the variable "name" of the process:"
>>>
>>
>>
>> This however does not seem to be true.
>>
>> The first rule is to receive a stream of objects of type MyObject.
>> This rule starts an associated process.
>>
>> The second rule will be called by the process (from bpmn).
>>
>> Within the process there a task that invokes an an asynchronous service,
>> ie,
>> an implementation of WorkItemHandler that contains a Thread that will set
>> call
>> manager.completeWorkItem(workItemId,results);
>> when 30s have passed).
>>
>> With this setup we can observe what happens when 2 MyObject instances
>> come into the first rule separated by a short period of time (say 5
>> seconds).
>>
>> When the first object comes in a process is created and started (with
>> process id=1)
>> The process passes from the start node to the callMyTask node, which
>> invokes the slow WorkItemHandler references by MyTask
>> (which we have previously registered into session.getWorkItemManager() ).
>> Because the WorkItemHandler has a thread that waits 30s before completing
>> the work item, it just sits there doing nothing (so far everything is ok)
>> and allows the engine to process other events.
>>
>> 5 seconds later we insert another MyObject into the stream.
>> The first rule gets fired and created another process (with process id=2).
>> The process passes from the start node to the callMyTask node, which
>> invoke our slow service.
>>
>> We have thus two processes running in parallel.
>>
>> When the first callMyTask node completes, the next node completeTask is
>> invoked.
>>
>> The rule "process complete" is matched as it belongs to the rule flow
>> group "Complete task group".
>>
>> At this point we observe that the rule is matched twice spitting out:
>>
>>     processInstance.id 2
>>     processInstance.id 1
>> .
>> So the rule has matched both process instances that are in working memory
>> and not just the one (with process id 1)
>> that called the "process complete" rule.
>>
>>
>>
>> The rule file
>> -------------
>>
>> rule "New case"
>>     when
>>         $myobject : MyObject(processed==false) from entry-point "myobject
>> stream"
>>     then
>>         ProcessInstance
>> processInstance=kcontext.getKnowledgeRuntime().createProcessInstance("com.mycompany.process.MyProcess",
>> parameters);
>>         insert(processInstance);
>>
>> kcontext.getKnowledgeRuntime().startProcessInstance(processInstance.getId());
>>         modify ($myobject){
>>             setProcessed(true)
>>         }
>>     end
>>
>> rule "process complete"
>>     ruleflow-group "Complete task group"
>>     no-loop true
>>     when
>>         $processInstance: WorkflowProcessInstance()
>>     then
>>         System.out.println("processInstance.id " +
>> $processInstance.getId());
>>     end
>>
>>
>> The BPMN xml
>> ------------
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <definitions id="Definition"
>>              targetNamespace="http://www.jboss.org/drools"
>>              typeLanguage="http://www.java.com/javaTypes"
>>              expressionLanguage="http://www.mvel.org/2.0"
>>              xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
>>              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>              xsi:schemaLocation="
>> http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
>>              xmlns:g="http://www.jboss.org/drools/flow/gpd"
>>              xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI"
>>              xmlns:dc="http://www.omg.org/spec/DD/20100524/DC"
>>              xmlns:di="http://www.omg.org/spec/DD/20100524/DI"
>>              xmlns:tns="http://www.jboss.org/drools">
>>
>>     <process processType="Private" isExecutable="true"
>> id="com.mycompany.process.MyProcess" name="my process" >
>>
>>         <!-- process variables -->
>>
>>         <!-- nodes -->
>>         <startEvent id="start" name="StartProcess" />
>>
>>         <task id="callMyTask" name="call my task" tns:taskName="MyTask" >
>>             <ioSpecification>
>>             </ioSpecification>
>>         </task>
>>
>>
>>         <businessRuleTask id="completeTask" name="Complete slow task"
>> g:ruleFlowGroup="Complete task group" >
>>         </businessRuleTask>
>>
>>         <endEvent id="end" name="EndProcess" />
>>
>>         <!-- connections -->
>>         <sequenceFlow id="start-callMyTask" sourceRef="start"
>> targetRef="callMyTask" />
>>         <sequenceFlow id="callMyTask-completeTask" sourceRef="callMyTask"
>> targetRef="completeTask" />
>>         <sequenceFlow id="completeTask-end" sourceRef="completeTask"
>> targetRef="end" />
>>     </process>
>> </definitions>
>>
>>
>> What's wrong with this?  Isn't WorkflowProcessInstance() supposed to be
>> attached to the calling ProcessInstance?  Is there another way of getting
>> the group of rules fire only for the processinstance that called it?
>>
>>
>> Greets,
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20120213/dff3db63/attachment.html 


More information about the rules-users mailing list