ProcessEventListener doesn't set process variable

508 views
Skip to first unread message

Jérôme Gisson

unread,
Sep 23, 2016, 3:21:50 AM9/23/16
to jBPM Usage
Hi,

I post this question in jBPM Development forum but maybe I'm wrong, so post it again here.

In a spring-boot application (jBPM 6.4 embedded), I create a ProcessEventListener to reload an object from an external database (NoSQL) during my process.

I use the beforeNodeTriggered method to set or update the variable with the following code:

  WorkflowProcessInstanceImpl pi = (WorkflowProcessInstanceImpl) event.getProcessInstance();
  WorkflowCase wfCase = new WorkflowCase();
  wfCase.setCaseId("case-id");
  wfCase.setCaseOrigin("case origin");
  wfCase.setServiceLevel("level");
  pi.setVariable("wfCase", wfCase);

No error occur during the
ProcessEventListener, but when I try to use the "wfCase" variable later in a gateway, the variable is not up to date (I got a NPE because the wfCase is null).

Is it the good way to reload process variable from external database ?
If yes, how I can set the process variable ?

Regards,
Jérôme.

Maciej Swiderski

unread,
Sep 23, 2016, 3:31:34 AM9/23/16
to Jérôme Gisson, jBPM Usage
I'd recommend to use pluggable variable persistence strategies - see this article http://mswiderski.blogspot.se/2014/02/jbpm-6-store-your-process-variables.html

if you want to stick to process event listener you could try to use following code:
VariableScopeInstance variableScopeInstance = (VariableScopeInstance) ((ProcessInstance) event.getProcessInstance()).getContextInstance(VariableScope.VARIABLE_SCOPE);
if (variableScopeInstance != null) {
    variableScopeInstance.setVariable(variableName, VALUE);
}

Maciej

--
You received this message because you are subscribed to the Google Groups "jBPM Usage" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jbpm-usage+unsubscribe@googlegroups.com.
To post to this group, send email to jbpm-...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jbpm-usage/bd926662-6745-41e5-8da8-95fee6012805%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Jérôme Gisson

unread,
Sep 23, 2016, 9:13:49 AM9/23/16
to jBPM Usage, jerome...@gmail.com
Thank you for your suggestion about pluggable variable persistence, I keep it in mind :)

But for now, I try with the
process event listener approach and I tests your code with the same result.
I also try this, with the same result:
  KieSession ksession = (KieSession) event.getKieRuntime();
  WorkflowProcessInstanceImpl pi = (WorkflowProcessInstanceImpl) event.getProcessInstance();
  Map<String, Object> variables = new HashMap<String, Object>(1);
  variables.put(VAR_WF_CASE, wfCase);
  ksession.execute(new SetProcessInstanceVariablesCommand(pi.getId(), variables));

So I try to set my variable in a ScriptTask at the begin of my process:
  org.tests.model.WorkflowCase scriptCase = new
org.tests.model.WorkflowCase();
  scriptCase.setCaseId("case-id");
  scriptCase.setCaseOrigin("case origin");
  scriptCase.setServiceLevel("level");
  kcontext.setVariable("wfCase", scriptCase);

Each time the variable wfCase is null.

The
org.tests.model.WorkflowCase class is a POJO. jBPM can persist it in process variable ?

Regards,
Jérôme.


To unsubscribe from this group and stop receiving emails from it, send an email to jbpm-usage+...@googlegroups.com.

Maciej Swiderski

unread,
Sep 23, 2016, 10:27:34 AM9/23/16
to Jérôme Gisson, jBPM Usage
you would have to share your process, listener and the way you invoke it. It’s been used quite a lot that way so I am quite sure it works

Maciej

Jérôme Gisson

unread,
Sep 26, 2016, 9:42:28 AM9/26/16
to jBPM Usage, jerome...@gmail.com

Hi,

I attach a zip file with a kmodule project (Maven 3, jBPM 6.4).
It includes the bpmn file, service task class, the process event listener and a jUnit test based on JbpmJUnitBaseTestCase class use to test the process.

When i run the junit class, I got the follow exception:

org.jbpm.workflow.instance.WorkflowRuntimeException: [subscription:1 - Load Case:4] -- [subscription:1 - Case Partages / Manuel:5] -- Exception when trying to evaluate constraint Partages in split Case Partages / Manuel
    at org.jbpm.workflow.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:149)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325)
    at org.jbpm.workflow.instance.node.StartNodeInstance.triggerCompleted(StartNodeInstance.java:73)
    at org.jbpm.workflow.instance.node.StartNodeInstance.internalTrigger(StartNodeInstance.java:44)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173)
    at org.jbpm.ruleflow.instance.RuleFlowProcessInstance.internalStart(RuleFlowProcessInstance.java:35)
    at org.jbpm.process.instance.impl.ProcessInstanceImpl.start(ProcessInstanceImpl.java:236)
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:439)
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:208)
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:191)
    at org.jbpm.process.instance.ProcessRuntimeImpl.startProcess(ProcessRuntimeImpl.java:183)
    at org.drools.core.impl.StatefulKnowledgeSessionImpl.startProcess(StatefulKnowledgeSessionImpl.java:1807)
    at org.drools.core.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:122)
    at org.drools.core.command.runtime.process.StartProcessCommand.execute(StartProcessCommand.java:40)
    at org.drools.core.command.impl.DefaultCommandService.execute(DefaultCommandService.java:36)
    at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
    at org.drools.persistence.SingleSessionCommandService$TransactionInterceptor.execute(SingleSessionCommandService.java:592)
    at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
    at org.drools.persistence.jpa.OptimisticLockRetryInterceptor.execute(OptimisticLockRetryInterceptor.java:82)
    at org.drools.core.command.impl.AbstractInterceptor.executeNext(AbstractInterceptor.java:41)
    at org.drools.persistence.jta.TransactionLockInterceptor.execute(TransactionLockInterceptor.java:73)
    at org.drools.persistence.SingleSessionCommandService.execute(SingleSessionCommandService.java:385)
    at org.drools.core.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:256)
    at org.tests.bpmn.SubscriptionProcessTest.startProcessForManualCase(SubscriptionProcessTest.java:76)
    at org.tests.bpmn.SubscriptionProcessTest.testCaseComplete(SubscriptionProcessTest.java:54)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.jbpm.workflow.instance.WorkflowRuntimeException: [subscription:1 - Case Partages / Manuel:5] -- Exception when trying to evaluate constraint Partages in split Case Partages / Manuel
    at org.jbpm.workflow.instance.node.SplitInstance.internalTrigger(SplitInstance.java:67)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.trigger(NodeInstanceImpl.java:173)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerNodeInstance(NodeInstanceImpl.java:366)
    at org.jbpm.workflow.instance.impl.NodeInstanceImpl.triggerCompleted(NodeInstanceImpl.java:325)
    at org.jbpm.workflow.instance.impl.ExtendedNodeInstanceImpl.triggerCompleted(ExtendedNodeInstanceImpl.java:44)
    at org.jbpm.workflow.instance.node.StateBasedNodeInstance.triggerCompleted(StateBasedNodeInstance.java:341)
    at org.jbpm.workflow.instance.node.StateBasedNodeInstance.triggerCompleted(StateBasedNodeInstance.java:318)
    at org.jbpm.workflow.instance.node.WorkItemNodeInstance.triggerCompleted(WorkItemNodeInstance.java:323)
    at org.jbpm.workflow.instance.node.WorkItemNodeInstance.workItemCompleted(WorkItemNodeInstance.java:385)
    at org.jbpm.workflow.instance.node.WorkItemNodeInstance.signalEvent(WorkItemNodeInstance.java:361)
    at org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.signalEvent(WorkflowProcessInstanceImpl.java:484)
    at org.drools.persistence.jpa.processinstance.JPAWorkItemManager.completeWorkItem(JPAWorkItemManager.java:147)
    at org.jbpm.process.workitem.bpmn2.ServiceTaskHandler.executeJavaWorkItem(ServiceTaskHandler.java:261)
    at org.jbpm.process.workitem.bpmn2.ServiceTaskHandler.executeWorkItem(ServiceTaskHandler.java:175)
    at org.drools.persistence.jpa.processinstance.JPAWorkItemManager.internalExecuteWorkItem(JPAWorkItemManager.java:69)
    at org.jbpm.workflow.instance.node.WorkItemNodeInstance.internalTrigger(WorkItemNodeInstance.java:138)
    ... 51 more
Caused by: java.lang.RuntimeException: Exception when trying to evaluate constraint Partages in split Case Partages / Manuel
    at org.jbpm.workflow.instance.node.SplitInstance.executeStrategy(SplitInstance.java:93)
    at org.jbpm.workflow.instance.node.SplitInstance.internalTrigger(SplitInstance.java:63)
    ... 66 more
Caused by: java.lang.RuntimeException: unable to execute ReturnValueEvaluator:
    at org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator.evaluate(ReturnValueConstraintEvaluator.java:131)
    at org.jbpm.workflow.instance.node.SplitInstance.executeStrategy(SplitInstance.java:86)
    ... 67 more
Caused by: java.lang.NullPointerException
    at org.tests.Process_org$u46$tests$u46$subscription341203229.returnValueEvaluator2(Process_org$u46$tests$u46$subscription341203229.java:21)
    at org.tests.Process_org$u46$tests$u46$subscription341203229ReturnValueEvaluator2Invoker.evaluate(Process_org$u46$tests$u46$subscription341203229ReturnValueEvaluator2Invoker.java:15)
    at org.jbpm.process.instance.impl.ReturnValueConstraintEvaluator.evaluate(ReturnValueConstraintEvaluator.java:129)
    ... 68 more

Let me know if you can reproduice this issue.

Regards,
Jérôme.
jbpm-processeventlistener.zip

Maciej Swiderski

unread,
Sep 26, 2016, 1:45:09 PM9/26/16
to Jérôme Gisson, jBPM Usage
Problem is not the listener as that work as expected but your service task “Load Case” as this has defined output mapping which overriddes the value set by the listener. So remove all mapping of the service task if it should not set it and then all works as expected.

Maciej

For more options, visit https://groups.google.com/d/optout.
<jbpm-processeventlistener.zip>

Jérôme Gisson

unread,
Sep 27, 2016, 3:32:42 AM9/27/16
to jBPM Usage, jerome...@gmail.com
Hi,

Thanks a lot for you reply it works after remove the output mapping :)

I use Bpmn2 Diagram Editor to edit my process and the "Output Data Mapping" section was empty. So I open the process with BPMN Process Editor and I saw the mapping in "Result Mapping" section.
What editor do you recommend ? Is Bpmn2 Diagram Editor stable ?

Regards,
Jérôme.

Maciej Swiderski

unread,
Sep 27, 2016, 9:30:14 AM9/27/16
to Jérôme Gisson, jBPM Usage
glad to hear it worked as expected. I'd say BPMN2 editor should be used as it's being developed. If you prefer web based tooling the web designer in workbench is a good choice too.

Maciej

To unsubscribe from this group and stop receiving emails from it, send an email to jbpm-usage+unsubscribe@googlegroups.com.

To post to this group, send email to jbpm-...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages