The execution model is the system
used to start message flows through a series of nodes.
When an execution group is initialized, the appropriate loadable
implementation library (LIL) files
and Plug-in Archive
(PAR) files are made available to the runtime environment. The
execution group runtime process starts, and creates a dedicated configuration
thread.
You are responsible for ensuring that a user-defined
node is thread-safe. If a node updates a variable across multiple
threads then appropriate locking must be in place. Do not compromise
this threading model in your implementation of user-defined nodes.
Consider the following points:
- An input message sent to a message flow is processed only by the
thread that received it.
- A single instance of a user-defined extension might be invoked
on several threads concurrently.
- The message flow execution environment is conceptually similar
to procedural programming. Nodes that you insert into a message flow
are similar to subroutines called using a function call interface.
However, rather than a call-return interface, in which parameters
are passed in the form of input message data, the execution model
is referred to as a propagation-and-return model.
As an example, consider a message flow in which you use both user-defined
nodes and parsers. You use a user-defined node to process messages,
and a user-defined parser to parse messages; both the node and parser
contain implementation functions. The broker calls the implementation
functions, or callback functions, when certain events occur:
- When an input message is received by the message flow and is propagated
to the user-defined node:
- For C nodes, the broker calls the cniEvaluate function
for the user-defined node. See cniEvaluate.
- For Java™ nodes, the broker calls the evaluate method
that is implemented by the user-defined node.
- If the user-defined node wants to query the message to decide
what to do with it, the node calls a C utility function or a Java method, as appropriate for the language
in which the node is written.
The broker invokes the user-defined parser on one of its implementation
functions, for example cpiParseFirstChild. This
function instructs the parser to build the parse tree. The parser
builds the tree by invoking utility functions that create elements
in the parse tree, for example cpiCreateElement.
The parser can be called many times by the broker.