Callouts (2) – Pre-Callouts vs Post-Callouts


Después de una semanita sin postear nada, he estado bastante liado en varios proyectos que tenemos entre manos, retomamos el tema de los callouts en Microsoft Dynamics CRM 3.0. En el post anterior de esta serie vimos los conceptos básicos de los callouts, hoy intentaremos explicar los dos tipos de callouts de los que disponemos y sus diferencias.

Pre-Callouts

Un pre-callout es un callout invocado por la plataforma de Microsoft CRM antes de la ejecución del evento para el que se ha registrado. Esto quiere decir, que antes de que el CRM realice la operación se ejecutará nuestra callout, dándonos la posibilidad de insertar la lógica que queramos antes de que se produzca la ejecución de la operación en Microsoft CRM.

El código de los pre-callouts (al igual que el de los post-callouts) se ejecuta de manera síncrona. Esto significa que el sistema inicia la ejecución del código del callout y espera a que se complete su ejecución antes de continuar con la ejecución de algún otro pre-callout registrado para el mismo evento o ejecutar la operación de Microsoft CRM que lo ha disparado. Este modelo de ejecución nos permite, como veremos, realizar modificaciones sobre los datos dirigidos a la operación de Microsoft CRM. Pero también tiene una contrapartida que debemos tener muy en cuenta. Al insertar un callout estamos aumentando el tiempo de ejecución de la operación de Microsoft CRM, por lo que debemos tratar de optimizar nuestro código para evitar introducir demasiada latencia en las operaciones. E incluso, lanzar ejecuciones asíncronas en otro Thread siempre que sea posible.

Cuando un pre-callout es invocado, el sistema le pasa el conjunto completo de atributos de la entidad involucrada en la operación, pero solo los atributos con un valor distinto de nulo, el contexto de la entidad y el contexto de usuario. El pre-callout puede modificar el conjunto de atributos y devolvérselos al sistema. Además, el pre-callout tiene la posibilidad de indicar devolverle instrucciones al sistema sobre la ejecución de la operación, indicándole si continuar, si no ejecutar más callouts del mismo evento, o si abortar la ejecución de la operación de Microsoft CRM. Incluso, es posible devolver un mensaje de error, el cual será mostrado al usuario si el callout le pide al sistema que aborte la ejecución. La siguiente imagen obtenida del SDK de Microsoft CRM ilustra el modelo de los pre-callouts.

 



Si hay más de un pre-callout registrado para el mismo evento, el sistema los invoca de manera secuencial. Los contextos de entidad y usuario serán los mismos en cada invocación, pero el conjunto de atributos puede variar, ya que cada callout puede modificarlos.

Ejemplo de firma de un pre-callout:

public virtual PreCalloutReturnValue PreCreate(
CalloutUserContext userContext,
CalloutEntityContext entityContext,
ref string entityXml,
ref string errorMessage
);

Post-Callouts

Los post-callouts son invocados una vez se ha completado con éxito la ejecución de la operación en el sistema, es decir, si por algún motivo falla la ejecución de la operación del sistema los post-callouts no se ejecutan. Y al igual que ocurre con los pre-callouts, no tenemos límite en el número de post-callouts a registrar para un evento, estos se ejecutarán de forma secuencial.

Una diferencia clave con respecto a los pre-callouts, es el conjunto de atributos de la entidad que reciben. En este caso, debemos de especificar en la configuración del callout que atributos de la entidad queremos recibir. Y además tenemos dos conjuntos de atributos de la entidad, los pre-values que son los atributos que tenía la entidad antes de ser procesada por el sistema, y los post-values que son los valores de los atributos de la entidad una vez que esta ha sido procesada por el sistema. Por lo tanto debemos de indicar que conjunto de atributos previos necesitamos, y que conjunto de valores posteriores necesitamos.

Como ya mencionamos, los post-callouts también se ejecutan de forma síncrona con el sistema aunque en este caso no es posible indicar instrucciones sobre la ejecución ya que no hay ningún valor de retorno (no podemos detener la ejecución de callouts, abortar….) Y es aquí donde se hace más relevante el buscar modelos de ejecución asíncrona en nuestro código, ya que al no poder influir sobre el resultado de la operación en el CRM no tiene sentido aumentar el tiempo de ejecución. Por ejemplo, si pensamos en un post-callout que escriba un log de modificaciones de datos de entidades, lo lógico sería que el código del callout lancemos un thread que haga el trabajo para retornar la ejecución lo antes posible a Microsoft CRM.

Ejemplo de firma de un método de post-callout.

public virtual void PostUpdate(

CalloutUserContext userContext,

CalloutEntityContext entityContext,

string preImageEntityXml,

string postImageEntityXml

);
 

Pre vs Post

Ahora que ya tenemos más o menos claro el concepto de pre-callout y el de post-callout ¿Cuándo utilizamos los pre y cuando los post?

Pues como siempre, depende. Pero como norma general, los pre-callouts estarán indicados para aquellas situaciones en las que necesitemos poder modificar el conjunto de datos que recibe una operación de Microsoft CRM o evaluar este conjunto para influir sobre la ejecución de la operación. Por ejemplo, comprobación de duplicados, atributos calculados, validación de datos, etc. Mientras que los post-callouts estarán indicados para situaciones en las que no necesitemos influir sobre los atributos o sobre la ejecución de la operación y en las que necesitemos estar seguros que la operación ha sido realizada. Como por ejemplo, log de modificaciones, sincronización con otros sistemas, etc.

En la siguiente entrega

En el siguiente post de la serie veremos cómo desarrollar un pre y un post-callout, y cómo registrarlos estableciendo las configuraciones adecuadas en el fichero callout.config.xml. Pero ya os adelanto que para desarrollar un callout disponemos de una clase base de la que tendremos que heredar y redefinir el evento(s) que queramos manejar.

Si queréis ver más cosas y no podéis esperar al siguiente post, en el SDK de Microsoft CRM 3.0 tenéis disponible muchísima información sobre los callouts y su desarrollo.

Espero vuestro comentarios y sugerencias, un saludo.

Marco Amoedo

Un comentario en “Callouts (2) – Pre-Callouts vs Post-Callouts”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *