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