Sunteți pe pagina 1din 3

Para obtener el valor de una variable mientras el proceso aún está en ejecución se

puede conseguir con:


runtimeService.getVariable(processInstance.getId(), "variable");

Sin embargo, hay que tener en cuenta que una vez finalizado el proceso las
variables son descartadas no pudiéndose recuperar de la forma anterior ya que la
instancia del proceso ya no existirá con lo que si id no nos servirá. Una vez
finalizado el proceso únicamente permanecen en los datos históricos del proceso
siempre y cuando el nivel de histórico de datos está indicado como «full» en la
configuración de Activiti. La siguiente sentencia nos dará las modificaciones de la
variables ordenadas por tiempo de modificación en una lista de elementos
HistoricVariableUpdate:
historyService.createHistoricDetailQuery().variableUpdates().orderByVariableName().
orderByTime().list();

Activar el nivel de histórico a nivel full puede dar como resultado que en las
tablas de histórico se inserten muchos datos lo cual puede afectar al rendimiento.
Una solución posible es pasar al proceso una variable que el proceso modificará y
en el que recuperaremos los datos una vez haya finalizado. Veamos el ejemplo.
Primero el proceso que tomará una decisión en base a un dato de entrada:
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:activiti="http://activiti.org/bpmn"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL
http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd"
targetNamespace="HelloWorldActiviti">

<process id="variables" name="Variables" isExecutable="true">


<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="descuentoTask" />

<scriptTask id="descuentoTask" scriptFormat="groovy">


<script>
output.descuento = new java.math.BigDecimal('0')
if (cliente.tipo ==
es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo.VIP) {
output.descuento = new java.math.BigDecimal('10')
}
</script>
</scriptTask>
<sequenceFlow id="flow2" sourceRef="descuentoTask" targetRef="end" />

<endEvent id="end" />


</process>
</definitions>

En una tarea scriptTask las variables del proceso pueden ser usadas como variables
del script, en este script groovy de la tarea si el cliente es VIP se asigna a una
variable un descuento de 10. Lo siguiente es el caso de prueba:
package es.com.blogspot.elblogdepicodev.activiti;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import org.activiti.engine.RuntimeService;
import org.activiti.engine.test.ActivitiRule;
import org.activiti.engine.test.Deployment;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;

import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente;
import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo;

@SuppressWarnings({ "rawtypes", "unchecked" })


public class VariablesTest extends ActivitiAbstractTest {

@Rule
public ActivitiRule activitiRule = new ActivitiRule("activiti-h2.cfg.xml");

@Test
@Deployment(resources = "bpmn/Variables.bpmn20.xml")
public void testNormal() {
Cliente cliente = new Cliente(Tipo.NORMAL);
Map output = new HashMap();

Map variables = new HashMap();


variables.put("cliente", cliente);
variables.put("output", output);

RuntimeService rs = activitiRule.getRuntimeService();
rs.startProcessInstanceByKey("variables", variables);

Assert.assertEquals(new BigDecimal("0"), output.get("descuento"));


}

@Test
@Deployment(resources = "bpmn/Variables.bpmn20.xml")
public void testVIP() {
Cliente cliente = new Cliente(Tipo.VIP);
Map output = new HashMap();

Map variables = new HashMap();


variables.put("cliente", cliente);
variables.put("output", output);

RuntimeService rs = activitiRule.getRuntimeService();
rs.startProcessInstanceByKey("variables", variables);

Assert.assertEquals(new BigDecimal("10"), output.get("descuento"));


}
}

El proceso se inicia con rs.startProcessInstanceByKey pasándole al proceso un mapa


con la variable cliente que usará el proceso para calcular el descuento y también
un mapa, output, donde recogeremos el descuento que calculará el proceso.
Finalmente, lo que sería el programa independiente:
package es.com.blogspot.elblogdepicodev.activiti;

import java.util.HashMap;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.h2.tools.Server;

import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente;
import es.com.blogspot.elblogdepicodev.activiti.misc.Cliente.Tipo;

public class Variables {

public static void main(String[] args) throws Exception {


Server server = null;
try {
server = Server.createTcpServer().start();

ProcessEngines.init();

ProcessEngine processEngine =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti-
mysql.cfg.xml").buildProcessEngine();

RuntimeService runtimeService =
processEngine.getRuntimeService();
RepositoryService repositoryService =
processEngine.getRepositoryService();

repositoryService.createDeployment().addClasspathResource("bpmn/Variables.bpmn20.xm
l").deploy();

Cliente cliente = new Cliente(Tipo.VIP);


Map variables = new HashMap();
Map output = new HashMap();
variables.put("cliente", cliente);
variables.put("output", output);

ProcessInstance pi =
runtimeService.startProcessInstanceByKey("variables", variables);

System.out.println("Descuento aplicado: " +


output.get("descuento"));
} finally {
ProcessEngines.destroy();
if (server != null)
server.stop();
}
}
}

S-ar putea să vă placă și