Alfresco · Listener genérico para tareas de Activiti (II)

En el artículo anterior sobre este tema, se crearon listener para capturar la creación y la terminación de tareas de usuario en Alfresco. No obstante, con este mecanismo no es posible capturar las tareas canceladas. Una tarea es cancelada cuando el usuario que ha iniciado el flujo, decide cancelarlo.

Para capturar este evento, es necesario interceptar el método parseRootElement de listener de BPMN.

public class CustomUserTaskListener implements BpmnParseListener {
	
	public void parseUserTask(Element element, ScopeImpl scope, ActivityImpl activity) {
		
        ActivityBehavior activitybehaviour = activity.getActivityBehavior();
        
        if (activitybehaviour instanceof UserTaskActivityBehavior) {
        	
        	UserTaskActivityBehavior userTaskActivity = (UserTaskActivityBehavior) activitybehaviour;
            userTaskActivity.getTaskDefinition().
                addTaskListener(TaskListener.EVENTNAME_CREATE, new CustomTaskCreateListener());
            userTaskActivity.getTaskDefinition().
                addTaskListener(TaskListener.EVENTNAME_COMPLETE, new CustomTaskCompleteListener()); 
            
        }
        
	}
	
	@Override
	public void parseRootElement(Element element, List<ProcessDefinitionEntity> processes) {
		
        for (ProcessDefinitionEntity processDefinition : processes) {
            processDefinition.
                addExecutionListener(ExecutionListener.EVENTNAME_END, new ProcessEndExecutionListener());
        }
		
	}
}

En la implementación del listener, las tareas pendientes tras la cancelación de un flujo pueden ser recuperadas para informar a un sistema externo.

/**
 * Delete task WS invocation on workflow cancel event.
 * No CANCEL EVENT available on TaskListener.
 */
public class ProcessEndExecutionListener extends ActivitiScriptBase implements ExecutionListener {
	
	private static final Log logger = LogFactory.getLog(ProcessEndExecutionListener.class);

	// Activiti flows are prefixed with an special ID
	private static final String ACTIVITI_PREFIX = "activiti$";

	@Override
	public void notify(DelegateExecution execution) throws Exception {
		
		ExecutionListenerExecution listenerExecution = (ExecutionListenerExecution) execution;
		
		WorkflowTaskQuery workflowTaskQuery = new WorkflowTaskQuery();
    	workflowTaskQuery.setTaskState(WorkflowTaskState.IN_PROGRESS);
    	workflowTaskQuery.setProcessId(ACTIVITI_PREFIX + listenerExecution.getProcessInstanceId());
        List<WorkflowTask> tasks = 
            getServiceRegistry().getWorkflowService().queryTasks(workflowTaskQuery, true);

        for (WorkflowTask task : tasks) {
        	ExecutorService executorService = Executors.newSingleThreadExecutor();
        	executorService.execute(new WSInvocatorTask(task));
        	executorService.shutdown();
        }
		
	}

	private class WSInvocatorTask implements Runnable {
		
		private WorkflowTask task;
		
		public WSInvocatorTask(WorkflowTask task) {
			this.task = task;
		}

		@Override
		public void run() {
			
			String taskId = task.getId();
			if (task.getId().startsWith(ACTIVITI_PREFIX)) {
				taskId = taskId.substring(ACTIVITI_PREFIX.length(), taskId.length());
			}

			// Perform any action with task
			// ...
		}
		
	}

}

5 comentarios en “Alfresco · Listener genérico para tareas de Activiti (II)

  1. Hola
    muy interesante tu artículo. Nos está sirviendo de ayuda para algunas ideas y necesidades que tenemos con Activity.
    Abusando algo de tu tiempo, me gustaría saber cual sería tu enfoque a la hora de “reasignar” una tarea. Hemos estado investigando y parece que no hay una forma “clara” de reasignar una tarea de un usuario a otro.
    Gracias por tus comentarios

  2. Buenas,

    Gracias por vuestro interés y encantado de poder echaros una mano.

    En Activiti ya no existe el concepto de tareas reasignables, así que debe realizarse por código. Necesitarías incluir algo así:

    task.setAssignee(user.getId());
    getTaskService().setAssignee(task.getId(), user.getId());

    Saludos

    • Gracias por la info!
      Una cosa más… ¿esta reasignación es posible con la tarea/task ya en curso?
      Muchísimas gracias por tu tiempo

      • Sí, la tarea puede ser reasignada en cualquier estado.

        Podéis tomar como ejemplo el flujo de trabajo “Ad Hoc” de Alfresco 4.2 para la casuística de reasignación de tareas.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s