He rastreado la documentación de JBPM 7 pero lucho por encontrar una solución.

En mi proceso JBPM (específicamente en un proceso de tarea de script - lenguaje Java), necesito acceder a las variables de proceso por última vez que se actualizó la hora y tomar una decisión basada en este valor, es decir, si el valor es mayor a 2 horas, realizar otra acción. ¿Alguien sabe si / cómo es posible acceder a las variables de proceso en la última actualización?

Puedo acceder al valor de la variable de proceso usando lo siguiente

String status = kcontext.getVariable("overallStatus"));

Y esto devuelve el valor de la variable de proceso generalStatus, pero parece que no puedo controlar la hora de la última modificación (¡lo que es más importante dentro de la tarea del script!), Sé que esta información se almacena en la variable de proceso como se muestra en el negocio proceso de GUI:

enter image description here

0
ScottFree 30 sep. 2020 a las 14:20

2 respuestas

La mejor respuesta

Conozco una solución que utiliza un workItemHandler personalizado, proporcionaré los detalles a continuación, con suerte, puede sustituir la tarea de script por un workItemHandler personalizado. Se puede obtener una lista de objetos VariableInstanceLog del AuditLogService para una variable de proceso determinada, desde cada uno de estos objetos de auditoría se puede acceder a la última fecha de modificación.

La lógica de su verificación requerida se puede implementar en el workItemHandler personalizado pasando el resultado a la instancia del proceso.

Aquí hay un fragmento de ejemplo de código que imprimirá la última fecha de modificación de una variable de proceso llamada 'TheResult' en la instancia de proceso actual.

public class CustomWorkItemHandler extends AbstractWorkItemHandler {

 private AuditLogService auditLogService; 

public CustomWorkItemHandler(KieSession ksession) {
    super(ksession);
}

public void executeWorkItem(WorkItem workItem,
                            WorkItemManager manager) {
  
        // sample parameters
        String sampleParam = (String) workItem.getParameter("SampleParam");
        String sampleParamTwo = (String) workItem.getParameter("SampleParamTwo");

        // complete workitem impl...
        
        auditLogService = new JPAAuditLogService(getSession().getEnvironment());
        
        //TheResult - is the process variable to check
        List<VariableInstanceLog> list = auditLogService.findVariableInstances(workItem.getProcessInstanceId(), "TheResult");
        if (list.size() > 0){
            VariableInstanceLog log = list.get(list.size()-1);
            System.out.println("Last Recorded Date:" + log.getDate());
        }
        
        // return results
        String sampleResult = "A result to return here";
        Map<String, Object> results = new HashMap<String, Object>();
        results.put("SampleResult", sampleResult);


        manager.completeWorkItem(workItem.getId(), results);
   
}

@Override
public void abortWorkItem(WorkItem workItem,
                          WorkItemManager manager) {
    // stub
}

}

Deberá agregar el jar workItemHandler personalizado empaquetado como un artefacto a través de Business-Central y registrar su workItemhandler pasando la ksession al constructor en su proyecto-> configuración-> Implementaciones-> WorkItemHandlers p. Ej.

HandlerNameHere - nuevo org.jbpm.contrib.CustomWorkItemHandler (ksession) - MVEL

Puede encontrar más detalles sobre la creación de un WorkItemHandler personalizado, utilizando un arquetipo de maven, aquí http://mswiderski.blogspot.com/ 2018/04 / jbpm-work-items-are-really-simple.html Y para incorporar customWorkItemHandler en su proceso, vea este breve video https://www.youtube.com/watch?v=_XIZ0KRTahE

1
user1040768 3 oct. 2020 a las 16:19

Además de la respuesta anterior, es posible acceder a la información requerida en una tarea de script utilizando la siguiente sintaxis de Java

org.jbpm.process.workitem.core.AbstractWorkItemHandler wih;

System.out.println("Ping");

org.kie.api.runtime.KieSession session = (org.kie.api.runtime.KieSession)kcontext.getKieRuntime();
org.jbpm.process.audit.AuditLogService auditLogService = new 
org.jbpm.process.audit.JPAAuditLogService(session.getEnvironment());
System.out.println("auditLogService="+auditLogService);

java.util.List<org.jbpm.process.audit.VariableInstanceLog> list = auditLogService.findVariableInstancesByName("status", true);
for (org.jbpm.process.audit.VariableInstanceLog v :list) {
    System.out.println("value="+v.getValue()+", date:"+v.getDate().toString());
}
0
ScottFree 9 oct. 2020 a las 09:33