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

:: Cookies de nuestra página web. ¿Para qué sirve cada una?

A menudo una pregunta que nos hacen es qué cookies se están utilizando en mi página y para qué sirven. Para ver las cookies, podemos selecci...