viernes, 28 de octubre de 2016

¿Por qué "no funcionan" las políticas de retención?

Recientemente un cliente me solicitó que desactivara un "contrato" de una lista de contratos una vez la fecha de "Caducidad" fuera alcanzada. Esta lista es una custom list, con un montón de metadatos personalizados y ficheros adjuntos. La fecha de "Caducidad" es un campo de tipo "Fecha y hora" (llamado "Automatic expiration") dentro de la misma lista. Por "desactivar" entendemos que hay otro campo de tipo booleano (llamado "Active"), que indica si el contrato está activo (="Yes") o inactivo (="No").

Sabiendo que el camino más fácil y rápido para lograr este objetivo es definir una política de retención, así lo hice: Creé un workflow muy sencillo que modificaba el valor del campo booleano, pasando de "Yes" a "No", y una política de retención para ejecutarlo una vez se alcanzara la fecha indicada por el campo "Automatic expiration" + 1 día (Día después de haber caducado).


Una vez implementado este sencillo proceso, creé un contrato de prueba y esperé a que se alcanzara la fecha (al día siguiente) para comprobar si había funcionado o no.

Para variar, como muchas veces en la vida, las cosas no funcionaron a la primera. La data había vencido, pero el contrato seguía activo. ¿Por qué?

La respuesta, en esta ocasión es fácil de entender y también de solucionar:

En la administración central de SharePoint existen 2 Timer Jobs encargados de ejecutar las políticas de retención:
  • "Information management policy"
  • "Expiration policy"
Por defecto estos Timer Jobs están configurados para ejecutarse semanalmente, así que este tipo de políticas basadas en un día concreto, solo se verían reflejadas una vez por semana.

Sabiendo esto, si vamos a la sección Monitoring de la administración central y pulsamos sobre "Job Definitions", podemos buscar estos dos Timer Jobs en la app web que nos concierna, pulsar sobre su nombre y modificar su ejecución para que sea diaria en lugar de semanal:


Tened en cuenta que es importante que el Timer Job "Information management policy" debe ejecutarse ANTES que el "Expiration policy". En mi caso programé el primero para las 2 a.m. y el segundo para las 3.a.m.

Guardamos nuestros cambios y, ahora sí, todas la políticas de este tipo que tengamos bajo esta aplicación web, van a funcionar perfectamente (salvo caída del servicio, claro está).

Para comprobarlo podemos forzar un "Run now" y quedarnos así, con una sonrisa al ver que todo funciona como esperábamos que lo hiciera.

¡¡Saludos y hasta la próxima!!

No hay comentarios: