How to do a multi-instance user task with a collection?

1,595 views
Skip to first unread message

crappe....@gmail.com

unread,
Jan 22, 2015, 10:01:29 AM1/22/15
to camunda-...@googlegroups.com
Hi,

I'm trying to make a multiple instance user task. The goal is to create multiple product like in this picture : https://drive.google.com/file/d/0B2C2J2isZp58dXU2bFJfcmtVajg/view?usp=sharing.

Here is my process with the eclipse modeler : https://drive.google.com/file/d/0B2C2J2isZp58UjE3MzRVRWs3bGc/view?usp=sharing

But when I run it I have 500 error : https://drive.google.com/file/d/0B2C2J2isZp58WTMyZ3Rnb2pmbjg/view?usp=sharing

Can you help me to do something like this : http://docs.jboss.org/jbpm/v6.0/userguide/chap-formmodeler.html ?

thorben....@camunda.com

unread,
Jan 23, 2015, 3:58:20 AM1/23/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi,

To help you with the error, we would need the log file of the application server you are running Camunda on. It should contain the exception that causes the error message in the UI.

Cheers,
Thorben

crappe....@gmail.com

unread,
Jan 23, 2015, 5:08:06 AM1/23/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi,

Apparently we got a null pointer exception. Do we need to declare the collection and the element variable as input parameters or some where else?

at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica
torBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:
953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp
11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(
AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoin
t.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:615)
at java.lang.Thread.run(Thread.java:745)

jan 23, 2015 10:55:05 AM org.camunda.bpm.engine.rest.exception.ExceptionHandler
toResponse
WARNING: java.lang.NullPointerException
at org.camunda.bpm.engine.impl.bpmn.behavior.MultiInstanceActivityBehavi
or.executeOriginalBehavior(MultiInstanceActivityBehavior.java:187)
at org.camunda.bpm.engine.impl.bpmn.behavior.ParallelMultiInstanceBehavi
or.createInstances(ParallelMultiInstanceBehavior.java:101)
at org.camunda.bpm.engine.impl.bpmn.behavior.MultiInstanceActivityBehavi
or.createInstancesIfPossible(MultiInstanceActivityBehavior.java:124)
at org.camunda.bpm.engine.impl.bpmn.behavior.MultiInstanceActivityBehavi
or.execute(MultiInstanceActivityBehavior.java:93)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationA
ctivityExecute.execute(PvmAtomicOperationActivityExecute.java:42)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationA
ctivityExecute.execute(PvmAtomicOperationActivityExecute.java:27)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTrans
itionNotifyListenerStart.java:63)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerStart.eventNotificationsCompleted(PvmAtomicOperationTrans
itionNotifyListenerStart.java:26)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:65)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:429)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:429)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionCreateScope.execute(PvmAtomicOperationTransitionCreateScope.java:55)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionCreateScope.execute(PvmAtomicOperationTransitionCreateScope.java:24)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerTake.execute(PvmAtomicOperationTransitionNotifyListenerTa
ke.java:76)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerTake.execute(PvmAtomicOperationTransitionNotifyListenerTa
ke.java:31)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:429)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerTake.execute(PvmAtomicOperationTransitionNotifyListenerTa
ke.java:61)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerTake.execute(PvmAtomicOperationTransitionNotifyListenerTa
ke.java:31)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionDestroyScope.execute(PvmAtomicOperationTransitionDestroyScope.java:118)

at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionDestroyScope.execute(PvmAtomicOperationTransitionDestroyScope.java:27)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerEnd.eventNotificationsCompleted(PvmAtomicOperationTransit
ionNotifyListenerEnd.java:36)
at org.camunda.bpm.engine.impl.pvm.runtime.operation.PvmAtomicOperationT
ransitionNotifyListenerEnd.eventNotificationsCompleted(PvmAtomicOperationTransit
ionNotifyListenerEnd.java:23)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:65)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:429)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:429)
at org.camunda.bpm.engine.impl.core.operation.AbstractEventAtomicOperati
on.execute(AbstractEventAtomicOperation.java:58)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:129)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(Command
Context.java:117)
at org.camunda.bpm.engine.impl.interceptor.CommandContext$1.call(Command
Context.java:115)
at org.camunda.bpm.engine.impl.context.ProcessApplicationClassloaderInte
rceptor.call(ProcessApplicationClassloaderInterceptor.java:44)
at org.camunda.bpm.application.AbstractProcessApplication.execute(Abstra
ctProcessApplication.java:102)
at org.camunda.bpm.engine.impl.context.Context.executeWithinProcessAppli
cation(Context.java:193)
at org.camunda.bpm.engine.impl.interceptor.CommandContext.performOperati
on(CommandContext.java:115)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperationSync(ExecutionEntity.java:450)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:440)
at org.camunda.bpm.engine.impl.persistence.entity.ExecutionEntity.perfor
mOperation(ExecutionEntity.java:420)
at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.take(PvmExec
utionImpl.java:280)
at org.camunda.bpm.engine.impl.bpmn.behavior.BpmnActivityBehavior.perfor
mOutgoingBehavior(BpmnActivityBehavior.java:101)
at org.camunda.bpm.engine.impl.bpmn.behavior.BpmnActivityBehavior.perfor
mDefaultOutgoingBehavior(BpmnActivityBehavior.java:50)
at org.camunda.bpm.engine.impl.bpmn.behavior.FlowNodeActivityBehavior.le
ave(FlowNodeActivityBehavior.java:44)
at org.camunda.bpm.engine.impl.bpmn.behavior.AbstractBpmnActivityBehavio
r.leave(AbstractBpmnActivityBehavior.java:46)
at org.camunda.bpm.engine.impl.bpmn.behavior.UserTaskActivityBehavior.si
gnal(UserTaskActivityBehavior.java:57)
at org.camunda.bpm.engine.impl.pvm.runtime.PvmExecutionImpl.signal(PvmEx
ecutionImpl.java:262)
at org.camunda.bpm.engine.impl.persistence.entity.TaskEntity.complete(Ta
skEntity.java:228)
at org.camunda.bpm.engine.impl.cmd.SubmitTaskFormCmd.execute(SubmitTaskF
ormCmd.java:73)
at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(C
ommandExecutorImpl.java:24)
at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.exe
cute(CommandContextInterceptor.java:97)
at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInt
erceptor.java:32)
at org.camunda.bpm.engine.impl.FormServiceImpl.submitTaskForm(FormServic
eImpl.java:86)
at org.camunda.bpm.engine.rest.sub.task.impl.TaskResourceImpl.submit(Tas
kResourceImpl.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.
java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces
sorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.
java:167)
at org.jboss.resteasy.core.ResourceMethod.invokeOnTarget(ResourceMethod.
java:257)
at org.jboss.resteasy.core.ResourceMethod.invoke(ResourceMethod.java:222
)
at org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(Resource
Locator.java:159)
at org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:1
07)
at org.jboss.resteasy.core.ResourceLocator.invokeOnTargetObject(Resource
Locator.java:154)
at org.jboss.resteasy.core.ResourceLocator.invoke(ResourceLocator.java:9
2)
at org.jboss.resteasy.core.SynchronousDispatcher.getResponse(Synchronous
Dispatcher.java:542)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispa
tcher.java:524)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispa
tcher.java:126)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.
service(ServletContainerDispatcher.java:208)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.servi
ce(HttpServletDispatcher.java:55)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.servi
ce(HttpServletDispatcher.java:50)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52
)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:210)
at org.camunda.bpm.engine.rest.filter.CacheControlFilter.doFilter(CacheC
ontrolFilter.java:47)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:210)
at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilterSe
cure(SecurityFilter.java:67)
at org.camunda.bpm.webapp.impl.security.filter.SecurityFilter.doFilter(S
ecurityFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:210)
at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.exec
ute(AuthenticationFilter.java:59)
at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter$1.exec
ute(AuthenticationFilter.java:56)
at org.camunda.bpm.webapp.impl.security.SecurityActions.runWithAuthentic
ations(SecurityActions.java:38)
at org.camunda.bpm.webapp.impl.security.auth.AuthenticationFilter.doFilt
er(AuthenticationFilter.java:56)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authentica
torBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:
953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:409)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp
11Processor.java:1044)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(
AbstractProtocol.java:607)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoin
t.java:313)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.
java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor
.java:615)
at java.lang.Thread.run(Thread.java:745)

Best regards,
Nicolas Crappe.

thorben....@camunda.com

unread,
Jan 23, 2015, 5:51:35 AM1/23/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi Nicolas,

You need to set the collection variable beforehand which results in as many instances of the MI-task as there are elements in the collection. The element variable is then automatically populated for every instance with one element of the collection. [1] gives more details on how you can use the MI task.
I am not sure if that is what you want to implement. Please explain your use case further so that we can assist you in a better way.

I created a ticket to throw a more meaningful exception in case the collection variable is missing, cf [2].

Cheers,
Thorben

[1] http://docs.camunda.org/latest/api-references/bpmn20/#tasks-task-markers-multiple-instance
[2] https://app.camunda.com/jira/browse/CAM-3356

webcyberrob

unread,
Jan 23, 2015, 6:10:46 AM1/23/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi,

My suggestion is to consider pageflow versus process flow. I suspect what you may want to achieve is pageflow.

Hence, you could potentially model this as a single user task rather than multi-instance. Lets call it Collect Order. Hence this form could be used to collect a 'basket' of goods. Hence in the form you use a collection to collect each lineitem and use the angular model/view/controller construct to manage the collection and view. At the end of the user interaction, the forms needs to submit the collection back into the process.

So in summary - do you really wnated a multi-instance user task at the process level, or do you want a multi-lineitem data entry capability at the form level?

regards

Rob

crappe....@gmail.com

unread,
Feb 4, 2015, 5:43:57 AM2/4/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi Thorben,

My apologize to reply only now, last week I was busy with another projects.

My use case is that I have a task where I can order one or more products of a certain type (e.g. bulk gas installation or cylinder gas installation). I'm trying to have a behavior like a basket in e-commerce. But I don't know how to express it in BPMN with Camunda.

So I tried a collection with multi-instances. But I still don't know how to create a collection of product (object with multiple field like size, number, etc.). When I run it I have the error : "Variable bulkCollection' is not a Collection". I set bulkCollection as a List in the input parameters. Do I need to create a Java class with my own collection?
Here are some screenshots how I configured the BPM schema : https://drive.google.com/folderview?id=0B2C2J2isZp58U0NGZVhrUWYxakE&usp=sharing.

With JBPM I was able to do it with list of objects (porduct) and sub forms. Can we do something similar with Camunda like this example : http://docs.jboss.org/jbpm/v6.0/userguide/images/FormModeler/2_execution.png ?

Regards,
Nicolas.

crappe....@gmail.com

unread,
Feb 4, 2015, 6:58:16 AM2/4/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi Rob,

Sorry for the delay of my answer. Your're perfectly right, I don't need a MI, a page flow would be good. Do you have an example because I don't find a lot of information about this topic. How can I save an AngularJs list model (in JSON) into a Camunda service. What do I need to do to declare the the collection in Camunda?

Sebastian Stamm

unread,
Feb 4, 2015, 9:29:47 AM2/4/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi Nicolas,

in the forms of the tasklist, you can work with serialized Java objects, as shown in this example [1]. To store your JSON data in a collection, you have to specify the Java class of the Collection in the objectTypeName of the valueInfo attribute, when creating the variable. 

Is this what you are looking for?

Regards
Sebastian

crappe....@gmail.com

unread,
Feb 5, 2015, 6:00:04 AM2/5/15
to camunda-...@googlegroups.com, crappe....@gmail.com
Hi Sebastian,

It was what I was looking for. I tested it : https://drive.google.com/file/d/0B2C2J2isZp58VWZMSTUzYldYTFU/view?usp=sharing and it's working.

A very very thank you to the all community for your help!

Reply all
Reply to author
Forward
0 new messages