Open IT Experts for Enterprise

Programando tareas en Alfresco

Cesar Capillas
Cesar Capillas

La programación de tareas de Alfresco permite la ejecución de tareas
de mantenimiento o contenidos de manera programada via quartz. Estos
procesos de mantenimiento deberían ser comunes para los
administradores de Alfresco, puesto que ejecutan tareas programadas
como la sincronización de usuarios o los backups de los índices de
lucene. Desde el punto de vista de los contenidos podemos también
configurar el quartz para taguear o categorizar contenidos por debajo
de un path, asignarles determinados aspectos, ejecutar procesos de
copia de determinados contenidos o hacer búsquedas en el repositorio
enviando las notificaciones correspondientes.

Se configura principalmente en el archivo:

/opt/alfresco34/tomcat/shared/classes/alfresco/extension/scheduled-action-services-context.xml

Existe una plantilla sample en el directorio extension con
algunos ejemplos prácticos.
En el caso de hoy, la tarea
programada se referirá (en abstracto) a la ejecución de un script de
Alfresco (en Javascript API). No voy a detallar el script
(zylkdigest.js) en cuestión, pero el caso de uso es un envío de correo
diario con una busqueda parametrizada via lucene query,  a un conjunto
de usuarios.

De este modo:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>

<!--
Define the model factory used to generate object models suitable for use with freemarker templates.
-->
    <bean id="templateActionModelFactory" class="org.alfresco.repo.action.schedule
d.FreeMarkerWithLuceneExtensionsModelFactory">
        <property name="serviceRegistry">
            <ref bean="ServiceRegistry"/>
        </property>
    </bean>
<!--
Execute the script
-->
    <bean id="runScriptAction" class="org.alfresco.repo.action.scheduled.SimpleTem
plateActionDefinition">
        <property name="actionName">
            <value>script</value>
        </property>
        <property name="parameterTemplates">
            <map>
                <entry>
                    <key>
                        <value>script-ref</value>
                    </key>
                    <value>${selectSingleNode('workspace://SpacesStore','lucene',
                    'PATH:"/app:company_home/app:dictionary/app:scripts/cm:zylkdigest.js"' )}</value>    
                </entry>
            </map>
        </property>
        <property name="templateActionModelFactory">
            <ref bean="templateActionModelFactory"/>
        </property>
        <property name="dictionaryService">
            <ref bean="DictionaryService"/>
        </property>
        <property name="actionService">
            <ref bean="ActionService"/>
        </property>
        <property name="templateService">
            <ref bean="TemplateService"/>
        </property>
    </bean>
    
    <!--
Run the script every minute
    -->
    <bean id="runScript"
          class="org.alfresco.repo.action.scheduled.CronScheduledQueryBasedTemplateActionDefinition">
        <property name="transactionMode">
            <value>UNTIL_FIRST_FAILURE</value>
        </property>
        <property name="compensatingActionMode">
            <value>IGNORE</value>
        </property>
        <property name="searchService">
            <ref bean="SearchService"/>
        </property>
        <property name="templateService">
            <ref bean="TemplateService"/>
        </property>
        <property name="queryLanguage">
            <value>lucene</value>
        </property>
        <property name="stores">
            <list>
                <value>workspace://SpacesStore</value>
            </list>
        </property>
        <property name="queryTemplate">
            <value>PATH:"/app:company_home"</value>
        </property>
        <property name="cronExpression">
            <value>0 0/1 * * * ?</value>
        </property>
        <property name="jobName">
            <value>jobD</value>
        </property>
        <property name="jobGroup">
            <value>jobGroup</value>
        </property>
        <property name="triggerName">
            <value>triggerD</value>
        </property>
        <property name="triggerGroup">
            <value>triggerGroup</value>
        </property>
        <property name="scheduler">
            <ref bean="schedulerFactory"/>
        </property>
        <property name="actionService">
            <ref bean="ActionService"/>
        </property>
        <property name="templateActionModelFactory">
            <ref bean="templateActionModelFactory"/>
        </property>
        <property name="templateActionDefinition">
            <ref bean="runScriptAction"/>
        </property>
        <property name="transactionService">
            <ref bean="TransactionService"/>
        </property>
        <property name="runAsUser">
            <value>System</value>
        </property>
    </bean>
</beans>


Y por último, hay que tener en cuenta además que en Alfresco
3.4.d Community no funciona bien:

https://issues.alfresco.com/jira/browse/ALF-9981

pero que está convientemente arreglado en la version enterprise.

Enlaces útiles:

Más entradas

Deja un comentario

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