Call Process

Calls another process inside the same job. The generator emits a direct hop, flattens the input mapping into headers and drops the output.

Translated com.tibco.pe.core.CallProcessActivity

What it does in BusinessWorks

Call Process invokes another process by its path in the project, given in <config><processName>. The callee’s Start schema decides what the caller has to map, the input mapping builds that document, and whatever the callee’s End activity produces comes back into the caller’s data space under the calling activity’s name. Later mappings reference it as $LookupCustomer/... the same way they reference any other activity output.

By default the call runs inside the calling job: same job identifier, same job-shared variables, same transaction, same thread. Ticking Spawn changes all of that. A spawned call starts a separate job, returns immediately with no output, and shares nothing with its parent except the input document it was handed.

Faults propagate. An uncaught fault in the callee surfaces in the caller as if it had been raised at the Call Process node, which is why so many BusinessWorks processes carry no error handling of their own.

The Camel equivalent

BusinessWorks 5.process
<pd:activity name="LookupCustomer">
  <pd:type>com.tibco.pe.core.CallProcessActivity
  </pd:type>
  <pd:resourceType>ae.process.subprocess
  </pd:resourceType>
  <config>
    <processName>/services/CustomerLookup.process
    </processName>
  </config>
  <pd:inputBindings>
    <root>
      <channel>
        <xsl:value-of select="'WHOLESALE'"/>
      </channel>
      <customerId>
        <xsl:value-of
          select="$Enrich/ActivityOutput/id"/>
      </customerId>
    </root>
  </pd:inputBindings>
</pd:activity>
Apache CamelJava DSL, generated
// wrapped for width; one line per step in the file
.setHeader("channel", constant("WHOLESALE"))
.setHeader("customerId", constant(""))
    // TODO_HUMAN
    // output reference: $Enrich/ActivityOutput/id
.to("direct:customerLookup")

Where the semantics diverge

The output never comes back. The rule emits headers and a .to(...), and nothing that reads the callee’s result. In BusinessWorks the sub-process output is addressable as $LookupCustomer/...; in the generated route it does not exist, so every downstream mapping that referenced it is translated against a value that was never set. Those mappings are exactly the ones that come out as constant("") with a TODO_HUMAN marker, so the damage is visible, but it is visible in the caller, one activity later, not at the call itself.

The input document becomes a flat header set. Bindings are walked to their leaves and each leaf is emitted as a header named after its own tag, with no parent path. Two leaves called id under different parents collide on one header. Anything the callee expected as a structured document has to be rebuilt by hand.

Spawn is not read. The rule looks at processName and nothing else. A spawned call, which in BusinessWorks returns immediately and runs on its own job, becomes an ordinary in-line .to(...) that blocks the caller until the callee finishes. Where Spawn was used to fire off logging or notification work, the migrated route now waits for it.

Targets are resolved by file name. When the path is not in the index of known routes, the endpoint is derived from the last segment of the path with the extension stripped and non-alphanumerics replaced. Two processes with the same file name in different folders resolve to the same direct: endpoint. With processName missing altogether the target is direct:TODO_resolve_callee, which compiles and has no consumer.

Decide the callee’s return contract before you run anything: either the sub-route sets the body and you rewrite the caller to read the body, or you give it an explicit output header and rewrite the mappings to use it. There is no configuration that recovers the original data space.

What the toolchain does

An unconditional rule, so no marker appears against the Call Process itself. It emits one setHeader per input-binding leaf, then .to("direct:<target>"). In YAML output the original process path is kept as a step description; in Java DSL the description is dropped, so the only record of what was called is the endpoint name.

Two site-specific unwrap rules can be configured on top, resolving named helper sub-processes (the kind of generic dispatcher most estates grow) through to their real target instead of calling them directly. When such a helper cannot be resolved the generator emits a TODO_HUMAN warning and falls back to the normal path.