17 de diciembre de 2017

:: Alfresco. Cómo desplegar un workflow

Tras le desarrollo de un workflow en Activity, podemos llevar a cabo el despliegue de este de distintas maneras.
Describiremos a continuación cómo tenemos estructurado el workflow.

En la ruta "shared/classes/alfresco/extension/" tenemos el fichero de contexto.
Fichero: activiti-adhoc-timer-workflow-context.xml

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

<beans>
    <bean id="lifecycle.workflowBootstrap" parent="workflowDeployer">
  <property name="workflowDefinitions">
   <list>
    <props>
     <prop key="engineId">activiti</prop>
     <prop key="location">alfresco/extension/activiti-adhoc-timer.bpmn20.xml</prop>
     <prop key="mimetype">text/xml</prop>
     <prop key="redeploy">false</prop>
    </props>
   </list>
  </property>
  <property name="labels">
   <list>
                <value>alfresco/extension/activiti-adhoc-timer-messages</value>
   </list>
  </property>
 </bean>
</beans>

Tendremos un fichero con los literales utilizados, en la siguiente ruta: "shared/classes/alfresco/web-extension/messages/".
Fichero: activiti-adhoc-timer-messages.properties

# For Activiti Timer Workflow Example
activitiAdhocTimer.workflow.title=Activiti Adhoc Timer 
activitiAdhocTimer.workflow.description=Activiti Adhoc Timer Sample Process 

La propia definición del workflow la hemos ubicado en la siguiente carpeta, referenciada desde el fichero de contexto: "shared/classes/alfresco/extension/workflow/".
Fichero: activiti-adhoc-timer.bpmn20.xml

<?xml version="1.0" encoding="UTF-8" ?>

<definitions id="adhoc-definitions"
             typeLanguage="http://www.w3.org/2001/XMLSchema"
             expressionLanguage="http://www.w3.org/1999/XPath"
             targetNamespace="http://activiti.org/bpmn20" 
             xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:activiti="http://activiti.org/bpmn">

    <process id="activitiAdhocTimer" name="Activiti Timer Adhoc">

        <startEvent id="start"
            activiti:formKey="wf:submitAdhocTask" />

        <sequenceFlow id='flow1' 
            sourceRef='start'
            targetRef='adhocTask' />

        <userTask id="adhocTask" name="Urgent task"
            activiti:formKey="wf:adhocTask">
           <extensionElements>
               <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
                  <activiti:field name="script">
                     <activiti:string>
                      if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
                      if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
                     </activiti:string>
                  </activiti:field>
               </activiti:taskListener>
           </extensionElements>
            <humanPerformer>
                <resourceAssignmentExpression>
                    <formalExpression>${bpm_assignee.properties.userName}</formalExpression>
                </resourceAssignmentExpression>
            </humanPerformer>
        </userTask>
        
        <!-- Boundry event attached to 'adhocTask', which will end the task after 1 minute -->
        <boundaryEvent id="timer" cancelActivity="true" attachedToRef="adhocTask" name="testTimer">
     <timerEventDefinition>
      <!-- ISO-8601 durations of one hour-->
      <timeDuration>PT1H</timeDuration>
    </timerEventDefinition>
  </boundaryEvent>   

        <sequenceFlow id='flow2' 
        sourceRef='adhocTask'
            targetRef='taskDone' />

        <userTask id="taskDone" name="Urgent task completed on time"
            activiti:formKey="wf:completedAdhocTask" >
            <documentation>
                The urgent task was completed on time by ${bpm_assignee.properties.userName}.
            </documentation>
            <extensionElements>
               <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
                  <activiti:field name="script">
                     <activiti:string>
                        if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
                     </activiti:string>
                  </activiti:field>
               </activiti:taskListener>
           </extensionElements>
            <humanPerformer>
                <resourceAssignmentExpression>
                    <formalExpression>${initiator.properties.userName}</formalExpression>
                </resourceAssignmentExpression>
            </humanPerformer>
        </userTask>
        
        <userTask id="taskExpired" name="Urgent task expired"
            activiti:formKey="wf:completedAdhocTask" >
            <documentation>
                The urgent task was NOT completed on time by ${bpm_assignee.properties.userName}.
            </documentation>
            <extensionElements>
               <activiti:taskListener event="create" class="org.alfresco.repo.workflow.activiti.tasklistener.ScriptTaskListener">
                  <activiti:field name="script">
                     <activiti:string>
                        if (typeof bpm_workflowDueDate != 'undefined') task.setVariableLocal('bpm_dueDate', bpm_workflowDueDate);
                        if (typeof bpm_workflowPriority != 'undefined') task.priority = bpm_workflowPriority;
                     </activiti:string>
                  </activiti:field>
               </activiti:taskListener>
           </extensionElements>
            <humanPerformer>
                <resourceAssignmentExpression>
                    <formalExpression>${initiator.properties.userName}</formalExpression>
                </resourceAssignmentExpression>
            </humanPerformer>
        </userTask>

        <sequenceFlow id='flow3' sourceRef='taskDone'
            targetRef='theEnd' /> 
        
        <sequenceFlow id='flow4' sourceRef='timer'
            targetRef='taskExpired' />
        
         <sequenceFlow id='veryLongTimer' sourceRef='taskExpired'
            targetRef='theEnd' />

        <endEvent id="theEnd" />
    </process>
</definitions>

Una opción sería que ante cualquier reinicio del servicio se volviera a re-desplegar el workflow, para lo que tendríamos que modificar la propiedades del fichero de contexto "activiti-adhoc-timer-workflow-context.xml":
< prop key="redeploy" >true< /prop >
Otra opción posible sería hacer uso de la consola de administración de flujos de trabajo. Inicialmente podemos ver los workflows desplegados mediante la intrucción:
show definitions


El acceso a esta consola se realiza por medio de la url siguiente: http://servidor:puerto/alfresco/s/admin/admin-communitysummary
O bien: http://localhost:8181/alfresco/
Seleccionar la entrada: Alfresco Administration Console

Para proceder al despliegue, la instrucción sería:
deploy activiti alfresco/extension/workflow/activiti-adhoc-timer.bpmn20.xml


Por defecto el motor activiti viene habilitado, pero en el caso de que necesitásemos otro motor, podríamos añadir las siguientes líneas en el fichero "alfresco-global.properties"
## Activity
system.workflow.engine.activiti.enabled=true
system.workflow.engine.activiti.definitions.visible=true

En el caso de utilizar JBPM, las entradas a definir serían:
### JBPM
system.workflow.engine.jbpm.enabled=true
system.workflow.engine.jbpm.definitions.visible=true


No hay comentarios:

Publicar un comentario

Déjanos tu comentario

:: Liferay. Obtener los usuarios activos desde Groovy

Una solución rápida para obtener la relación de usuarios activos en Liferay 7.4 es por medio de un script en Groovy. Para ello accederemos a...