cancel
Showing results for 
Search instead for 
Did you mean: 

multiple instance using Collection process variable

lojian
Champ in-the-making
Champ in-the-making
Hi,

I am doing an testing on using Multi-instance activity.

<callActivity id="callPublisherdeploy" name="Deploy All Publishers" calledElement="Publisherdeploy">
    <multiInstanceLoopCharacteristics isSequential="true">
        <loopDataInputRef>ALLPUBLISHERS</loopDataInputRef>
        <inputDataItem name="PUBLISHER" />
    </multiInstanceLoopCharacteristics>
</callActivity>
      

I am using following code to start the process instance:


Collection publishers = new ArrayList();
publishers.add("pub1");
publishers.add("pub2");
publishers.add("pub3");
HashMap<String, Object> params = new HashMap<String, Object>();
params.put("ALLPUBLISHERS",publishers)
runtime.startProcessInstanceByKey("testforeach",params);

It is strange that Activiti reports that:

Variable ALLPUBLISHERS' is not a Collection

Any idea?
2 REPLIES 2

frederikherema1
Star Contributor
Star Contributor
Strange, this is the code and looks okay to me:

org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior


else if (collectionVariable != null) {
      Object obj = execution.getVariable(collectionVariable);
      if (!(obj instanceof Collection)) {
        throw new ActivitiException("Variable " + collectionVariable+"' is not a Collection");
      }
      nrOfInstances = ((Collection) obj).size();

and

org.activiti.engine.impl.bpmn.parser.BpmnParse


// activiti:collection
      String collection = miLoopCharacteristics.attributeNS(BpmnParser.ACTIVITI_BPMN_EXTENSIONS_NS, "collection");
      if (collection != null) {
        if (collection.contains("{")) {
          miActivityBehavior.setCollectionExpression(expressionManager.createExpression(collection));
        } else {
          miActivityBehavior.setCollectionVariable(collection);
        }
      }

      // loopDataInputRef
      Element loopDataInputRef = miLoopCharacteristics.element("loopDataInputRef");
      if (loopDataInputRef != null) {
        String loopDataInputRefText = loopDataInputRef.getText();
        if (loopDataInputRefText != null) {
          if (loopDataInputRefText.contains("{")) {
            miActivityBehavior.setCollectionExpression(expressionManager.createExpression(loopDataInputRefText));
          } else {
            miActivityBehavior.setCollectionVariable(loopDataInputRefText);
          }
        }
      }

You're using java.util.ArrayList right Smiley Tongue ?

lojian
Champ in-the-making
Champ in-the-making
OMG!

It's my fault. I actually missed the parameters for starting the process instance.

Thank you Fred! Smiley Tongue  You are always helpful.


Strange, this is the code and looks okay to me:

org.activiti.engine.impl.bpmn.behavior.MultiInstanceActivityBehavior


else if (collectionVariable != null) {
      Object obj = execution.getVariable(collectionVariable);
      if (!(obj instanceof Collection)) {
        throw new ActivitiException("Variable " + collectionVariable+"' is not a Collection");
      }
      nrOfInstances = ((Collection) obj).size();

and

org.activiti.engine.impl.bpmn.parser.BpmnParse


// activiti:collection
      String collection = miLoopCharacteristics.attributeNS(BpmnParser.ACTIVITI_BPMN_EXTENSIONS_NS, "collection");
      if (collection != null) {
        if (collection.contains("{")) {
          miActivityBehavior.setCollectionExpression(expressionManager.createExpression(collection));
        } else {
          miActivityBehavior.setCollectionVariable(collection);
        }
      }

      // loopDataInputRef
      Element loopDataInputRef = miLoopCharacteristics.element("loopDataInputRef");
      if (loopDataInputRef != null) {
        String loopDataInputRefText = loopDataInputRef.getText();
        if (loopDataInputRefText != null) {
          if (loopDataInputRefText.contains("{")) {
            miActivityBehavior.setCollectionExpression(expressionManager.createExpression(loopDataInputRefText));
          } else {
            miActivityBehavior.setCollectionVariable(loopDataInputRefText);
          }
        }
      }

You're using java.util.ArrayList right Smiley Tongue ?