El modelo de ejecución es el sistema que se utiliza
para iniciar flujos de mensajes a través de una serie de nodos.
Cuando se inicializa un grupo de ejecución, los archivos
de biblioteca de implementación cargable
(LIL)
y los archivos de archivador de plug-in (PAR) apropiados
quedan disponibles en el entorno de ejecución. Se inicia el proceso de entorno de
ejecución del grupo de ejecución, y crea una hebra de configuración
dedicada.
Es responsable de asegurar que un nodo definido por el usuario
sea seguro para las hebras. Si un nodo actualiza una
variable en varias hebras cuando, debe estar presente el bloqueo apropiado. No comprometa este modelo de hebras en la implementación
de nodos definidos por el usuario.
Observe el ejemplo siguiente:
- Un mensaje de entrada enviado a un flujo de mensajes sólo lo procesa
la hebra que lo recibe.
- Una sola instancia de una extensión definida por el usuario puede ser
invocada en varias hebras simultáneamente.
- El entorno de ejecución del flujo de mensajes es similar conceptualmente a la programación de procedimientos. Los nodos que inserte en un flujo de mensajes son como subrutinas que se
invocan utilizando una interfaz de llamada de función.
No obstante, en
lugar de una interfaz de tipo "llamada y retorno", en la que se pasan los
parámetros con el formato de datos de mensaje de entrada, se hace referencia al modelo de
ejecución como un modelo de "propagación y retorno".
Tomemos como ejemplo un flujo de mensajes en el que utilice nodos y
analizadores definidos por el usuario. Utiliza un nodo definido por el usuario para procesar los mensajes y una
analizador definido por el usuario para analizarlos; tanto el nodo como el
analizador contienen funciones de implementación. Cuando se producen determinados sucesos, el intermediario llama a las
funciones de implementación, o a las funciones de devolución de llamada:
- Cuando el flujo de mensajes recibe un mensaje de entrada y se propaga
al nodo definido por el usuario:
- Para nodos en C, el intermediario llama a la función
cniEvaluate para el nodo
definido por el usuario. Consulte el apartado cniEvaluate.
- Para nodos
Java,
el intermediario llama al método evaluate
implementado por el nodo definido por el usuario.
- Si el nodo definido por el usuario desea consultar el mensaje para decidir qué debe
realizar con él, el nodo llama a una función de programa de utilidad C o un
método
Java,
según corresponda al lenguaje en el que se ha escrito el nodo.
A continuación, el intermediario invoca al analizador definido por el
usuario para una de sus funciones de implementación, por ejemplo cpiParseFirstChild. Esta
función indica al analizador que cree el árbol de análisis. El analizador crea el árbol invocando las funciones
de utilidad que crean elementos en el árbol de análisis, por
ejemplo cpiCreateElement.
El intermediario puede llamar
muchas veces al analizador.