Con el objetivo de ampliar el conocimiento en Alfresco y enseñar algunos aspectos que no se suelen tratar a menudo, en esta ocasión quiero explicar unos procesos que intervienen cada día en el mantenimiento de Alfresco y que generalmente desconocemos o no los tenemos en cuenta. Se trata de los “scheduled jobs”.
En Alfresco se ejecutan una serie de procesos automáticos de mantenimiento, algunos de ellos son nocturnos y otras se lanzan automáticamente cada cierto tiempo. Estas tareas son ajenas al usuario final pero no deberían serlo para los administradores de la plataforma. En docs.alfresco.com podréis encontrar información que os voy a resumir en este artículo.
Todos esas tareas están definidas en <configRoot>/scheduled-jobs-context.xml (cuando hablo de <configroot> me estoy refiriendo a la configuración dentro del fichero alfresco.war, ahí no debes tocarla, más abajo cuento como modificarlo, si fuese necesario). Algunas de las expresiones cron de estas tareas están definidas en <configRoot>/repository.properties. Recuerda que la sintaxis de este cron es diferente a la de UNIX, es Quartz y puedes ver ejemplos para entenderlo mejor aquí. si quieres cambiar algunas puedes hacerlo en alfresco-global.properties. Estas son las tareas de las que hablo:
- contentStoreCleanerTrigger: Lanza el bean contentStoreCleaner, que identifica, borra o purga contenidos huérfanos del contentstore. Un contenido es huérfano cuando todas las referencias en la base de datos al binario se han eliminado. En un entorno en cluster este proceso se puede activar en un sólo nodo, con lo que se mejora el rendimiento durante el proceso. Por defecto se ejecuta a las 4:00 AM cada día (0 0 4 * * ?). El parámetro “ProtectDays” establece el número mínimo de días que el contenido debe ser huérfano antes de poder eliminarlo, el valor predeterminado es de 14 días.
- nodeServiceCleanupTrigger: Realiza operaciones de limpieza en los nodos del DM, incluyendo transacciones antiguas y nodos antiguos eliminados. En un entorno en cluster este proceso se puede activar en un sólo nodo, con lo que se mejora el rendimiento durante el proceso. Se ejecuta a las 21:00h de cada día (0 0 21 * * ?).
- openOfficeConnectionTesterTrigger: Monitoriza y mantiene la conexión con OpenOffice. Se ejecuta cada minuto (0 * * * * ?).
- indexBackupTrigger: Hace un backup seguro de los directorios de Lucene. Crea el directorio “backup-lucene-indexes” y copia de forma segura la información de Lucene. Para conocer mejor como restaurarlo de forma incremental y evitar “FULL indexes” mira aquí. En un entorno en cluster este proceso se debe ejecutar en todos los nodos. Se ejecuta todos los días a las 3:00 AM (0 0 3 * * ?).
- tempFileCleanerTrigger: Limpia todos los ficheros temporales de Alfresco cada cierto tiempo. También se vacían directorios temporales y sus subdirectorios. Existe un parámetro llamado “protectHours” que permite indicar el tiempo de conservación de un fichero temporal desde su última modificación. Por ejemplo, ficheros resultantes de transformaciones, extractores, temporales de OpenOffice, etc., generalmente almacenado en <tomcat>/temp/Alfresco. Se ejecuta cada hora en el minuto 30 (0 30 * * * ?).
- avmOrphanReaperJob y avmExpiredContentTrigger: la primera tarea se ejecuta cada minuto para eliminar nodos huérfanos en el repositorio AVM y la segunda tarea sirve buscar contenido caducado en cada Web Project de WCM, se ejecuta cada día a las 3:30 AM. Si no has instalado AVM no te debes preocupar de esto, ya no se instala por defecto. Es el repositorio que usaba la implementación anterior de WCM.
- ehCacheTracerJob: Recoge las estadísticas detalladas de uso de la caché y las salidas por consola, dependiendo de la configuración de logs del servidor. Por defecto, no está activado. Para activarlo hay que eliminar el comentario correspondiente en el xml de configuración. Si se activa, se ejecuta en intervalos de 60 minutos.
- ftsIndexerTrigger: Esta tarea, aunque está en el fichero anterior, no es una tarea planificada en un momento concreto como tal, es para mantener los índices continuamente, se ejecuta cada minuto.
- Cuando Alfresco está configurado en cluster hay un proceso llamado “index.tracking” que se lanza cada 5 segundos y se encarga de mantener los índices de todos los nodos del cluster sincronizados.
- Sincronización de usuarios con LDAP: No es una tarea que que se gestione desde este fichero, pero es algo a tener en cuenta dentro de los trabajos planificados ya que dependiendo de la cantidad de usuarios que se sincronicen y la periodicidad de la sincronización, podría afectar al rendimiento de la plataforma. Una o dos veces al día, serían suficientes.
Recuerda que todos los detalles a bajo nivel de estas tareas específicas están descritas en el Java Doc de Alfresco en http://dev.alfresco.com/resource/docs/java/.
Estos trabajos planificados se pueden monitorizar mediante JXM en el bean Alfresco:Name=Schedule,Group=*,Type=*,Trigger=*
¿Cómo puedo cambiar el horario o configuración de estas tareas existentes? Hay dos formas de acceder a dicha información pero sólo una para modificarlos que es mediante archivos de configuración xml. Aunque si accedemos por JMX con la utilidad, por ejemplo, jconsole, podremos lanzar bajo demanda los procesos que necesitemos en cada momento o forzar la ejecución algún proceso concreto. Para cambiarlo modificando ficheros de configuración deberás copiar el fichero <configRoot>/alfresco/scheduled-jobs-context.xml a <extension>/custom-scheduled-jobs-context.xml y editarlo a tu gusto o necesidad.
Para ver los valores de las tareas y forzar su ejecución mediante JMX accede a tu servidor Alfresco con jconsole, aquí ves dos capturas, la primera es la vista general del bean:
y en la segunda vemos el ejemplo de la tarea que hace backup de los índices cada noche a las 3AM:
En la sección “Operations” de cada “Trigger” encontrarás un botón llamado “executeNow“, adivina para que sirve 😉 Cada tarea o trigger tiene una serie de propiedades que se explican por si solas, aunque me gustaría destacar la propiedad “Priority” que permite ejecutar una tarea sobre otra en caso de coincidir.
¿Cómo puedo hacer mi propia tarea planificada? Es algo que igual podría cubrir en un próximo artículo, de cualquier forma, puedes ver como hacerlo en esta página de la wiki. Y también puedes echar un vistazo al fichero <extension>/scheduled-action-services-context.xml.sample que es bastante ilustrativo.
Buen tema porque a veces no se saben las tareas que realiza Alfresco de forma automática. Es importante tener en cuenta la de la copia de indices para evitar que coincida el backup de Alfresco con el de los indices.
Te hago un apunte que en su dia me causo muchas dudas. El formato de las expresiones utilizadas para el cron siguen el patrón de Quartz, no de Unix. En este patron tenemos un dígito más que indica los segundos, el primero de todos.
En la wiki está muy bien explicado con ejemplos:
http://wiki.alfresco.com/wiki/Scheduled_Actions
Muchas gracias por el comentario Raúl, voy a actualizar el artículo con tu apunte ya que creo que es un punto que me faltó por decir.
Gracias!
Hola Toni, ante todo felicitarte por el exito que estas alcanzando, tengo una consulta parece que en mi alfresco ciertos contenidos se han quedado pegados, ya que me sale error de duplicado de nodos y sin embargo este nodo no existe en el espacio y tampoco en el ArchiveStore ya que no han sido eliminados,revisando la base de datos en la table alf_node,segun su store_id,figura que se encuentran en el workspace, no lo puedo eliminar completamente porque aun no son huerfanos..Que podria hacer..esto solo ocurre con algunos contenidos que podria estar pasando??..Gracias de antemano.
Muy buen artículo, clarito como siempre y para tenerlo siempre a mano 😉
Hola Tony, como estas? Te comento un problema que estoy teniendo despues de haber realizado un FULL reindex de alfresco, desde que lo realicé me está dando problemas de rendimiento, pues la CPU se carga al 100% y la memoria tambien se llena hasta que se cae el sistema y tengo que reiniciarlo cada hora y media aproximadamente desde la ultima vez que he reiniciado, algo extraño es que en el lapso de la 1 a las 5 de la madrugada esta carga de CPU no está por lo tanto no se cae, es normal esta carga del cpu y la inestabilidad del sistema luego de haber reindexado? Gracias por tu ayuda
Hola David, desconozco que puede ser lo que comentas, lo lógico es que haya un poco de carga en las horas que se hace backup pero no mucha, según los contenidos y modelo de datos. Comprueba las conexiones del servidor, dependiendo si es Enterprise o Community puedes mirar mediante JMX para ver qué está pasando y qué proceso es el que está consumiendo CPU y memoria. De cualquier forma recuerda asignarle al menos 2-4 GB de RAM a la JVM y usa una CPU de 64bits.
Saludos.
Hola, que tal! muy bueno el articulo.
Estoy teniendo el mismo problema que david. Tengo un alfresco en produccion (en cluster) que consume mucha memoria (se toma los 4gb de cada nodo del cluster) e intuyo que puede ser el job de backup de indices lo que lo hace lento.
Se trata de una instalacion con mucho contenido (casi un tera en archivos).
Lo que he visto en el log es que ese job nocturno tira un para de exceptions e intuyo que esos errores no controlados no cierran correctamente algunos recursos como archivos por lo que me va generando un memory leak gradualmente hasta tomamerme toda la memoria.
No obstante queria consultarlo con un experto en la materia para tener una mejor opinion.
Que opinas??
Saludos!!
Hola Rafael, dependiendo del uso que estés haciendo de Alfresco, 4GB de RAM por nodo puede ser incluso insuficiente, no descartes subir más memoria a la JVM.
Si tienes mucho contenido y los índices son bastante grandes, depende de la versión pero el backup puede tardar, no lo hagas en los dos nodos. Lo mejor es que utilices las últimas versiones que estarán más libres de fallos, aunque no se si el problema que tienes es por un fallo o una limitación de Lucene u otras circunstancias.
Saludos.
Hola Toni Muy buen articulo, me ha gustado ver el Scheduled_Actions, una pregunta que tengo, las búsquedas tanto simples o avanzadas no me van bien, puede ser debido a la indexación de la base de datos, habéis hecho alguna vez una Re-indexación de Mysql dentro de alfresco? sabéis que pasos hay que seguir.
Gracias
Hola, si las búsquedas no te funcionan esta relacionado con los índices y no con la bbdd. Deberás reindexar los índices (lucene o solr depende de lo que uses).
Saludos.