Java 从Camunda BPMN引擎访问当前流程实例变量信息

Java 从Camunda BPMN引擎访问当前流程实例变量信息,java,sql,camunda,Java,Sql,Camunda,我希望有关正在运行的进程实例的所有信息都存储在H2数据库中的act_proc_in_u表中。(如starttime、endtime、author.) 我在ExecutionListener方法(在实现JavaDelegate接口的类中)中,需要从中进一步转发信息 我知道使用createExecutionQuery()方法的RuntimeService接口,但在我看到的所有示例中,它似乎都映射到某种实体类。我不明白。 对不起,我是Camunda BPM引擎的新手 public clas

我希望有关正在运行的进程实例的所有信息都存储在H2数据库中的act_proc_in_u表中。(如starttime、endtime、author.)

我在ExecutionListener方法(在实现JavaDelegate接口的类中)中,需要从中进一步转发信息

我知道使用createExecutionQuery()方法的RuntimeService接口,但在我看到的所有示例中,它似乎都映射到某种实体类。我不明白。 对不起,我是Camunda BPM引擎的新手

    public class ProcessRequestDelegate implements JavaDelegate { 
    private final static Logger LOGGER = Logger.getLogger("LOAN-REQUESTS"); 
    public void execute(DelegateExecution execution) throws Exception { LOGGER.info("Processing request by '"+execution.getVariable("customerId")+"'...");
    System.out.println(execution.getVariable("amount")); 
    int Amount= ((Double) execution.getVariable("amount")).intValue(); System.out.println("Amountis"+Amount);

    ProcessEngine processEngine = BpmPlatform.getDefaultProcessEngine();
    RuntimeService runtimeService = processEngine.getRuntimeService(); 

    ResulstSet rs= runtimeService.createExecutionQuery("What to write here?"); 
 while (rs.next()) {
         String author=rs.getString("AUTHOR");
            Date start = rs.getDate("START_TIME");
            int sales = rs.getInt("SALES");

} }
       

从Camunda BPM 7.2开始,您可以使用execution.getProcessEngineServices()方法访问java委托类中的。使用HistoryService或RuntimeService创建(历史的)ProcessInstanceQuery,如

HistoryService HistoryService=execution.getProcessEngineServices().getHistoryService();
HistoricProcessInstance HistoricProcessInstance=historyService.createHistoricProcessInstanceQuery().processInstanceId(execution.getProcessInstanceId()).singleResult()

然后您可以访问HistoricProcess实例上的信息


请注意,您正在通过这些服务查询数据库。在提交事务之前,当前事务中更改的数据无法通过服务使用。

从Camunda BPM 7.2开始,您可以使用execution.getProcessEngineServices()方法访问java委托类中的。使用HistoryService或RuntimeService创建(历史的)ProcessInstanceQuery,如

HistoryService HistoryService=execution.getProcessEngineServices().getHistoryService();
HistoricProcessInstance HistoricProcessInstance=historyService.createHistoricProcessInstanceQuery().processInstanceId(execution.getProcessInstanceId()).singleResult()

然后您可以访问HistoricProcess实例上的信息


请注意,您正在通过这些服务查询数据库。在提交事务之前,在当前事务中更改的数据无法通过服务获得。

请正确设置问题的格式我希望这更具可读性?很抱歉。请将您的问题格式化。我希望这更具可读性?对此很抱歉。当我使用.singleResult()时,代码引发了一个异常。然后,我检索了一个列表中的数据(以检查是否检索到了任何内容),令人惊讶的是,列表的大小为0。我想知道这是怎么回事?这意味着进程还没有持久化到数据库。您可能仍在第一笔交易中。有关流程上下文中的事务以及您如何影响它们的描述,请参见[1]。[1] :非常感谢,它通过将servicetask的asyncbefore的值更改为true来工作。当我使用.singleResult()时,代码引发了一个异常。然后,我检索了一个列表中的数据(以检查是否检索到了任何内容),令人惊讶的是,列表的大小为0。我想知道这是怎么回事?这意味着进程还没有持久化到数据库。您可能仍在第一笔交易中。有关流程上下文中的事务以及您如何影响它们的描述,请参见[1]。[1] :非常感谢,它通过将servicetask的asyncbefore的值更改为true来工作。