java - 如何查询预定进程(定时器事件)?

标签 java rest business-process-management camunda

如果我使用定时器启动事件来安排进程的启动时间,如何查询哪些进程将启动以及何时启动?

另外,我对捕获计时器中间事件也有同样的问题。 camunda 引擎是否提供 API(Java 或 REST)来查询哪些计时器正在运行以及它们预计何时到期?

最佳答案

您可以通过 Java 和 REST API 检索使用计时器事件的进程的下一个计划执行时间,如下所示:

Java API 示例:

import org.camunda.bpm.ProcessEngineService;
import org.camunda.bpm.container.RuntimeContainerDelegate;
import org.camunda.bpm.engine.ManagementService;
import org.camunda.bpm.engine.ProcessEngine;
import org.camunda.bpm.engine.RepositoryService;
import org.camunda.bpm.engine.management.JobDefinition;
import org.camunda.bpm.engine.repository.ProcessDefinition;
import org.camunda.bpm.engine.runtime.Job;

import java.util.HashMap;
import java.util.List;

public class StackOverflow {

  public HashMap<ProcessDefinition, List<Job>> queryNextScheduledExecutionOfTimers() {
    ProcessEngineService processEngineService = 
    RuntimeContainerDelegate.INSTANCE.get().getProcessEngineService();
    ProcessEngine defaultProcessEngine = processEngineService.getDefaultProcessEngine();

    // optional step - get all active process definitions
    RepositoryService repositoryService = defaultProcessEngine.getRepositoryService();
    List<ProcessDefinition> processDefinitions =
        repositoryService.createProcessDefinitionQuery().active().list();

    ManagementService managementService = defaultProcessEngine.getManagementService();

    HashMap<ProcessDefinition,List<Job>> timerJobsByProcessDefinition = new HashMap<ProcessDefinition, List<Job>>();
    for (ProcessDefinition processDefinition : processDefinitions) {
      List<JobDefinition> jobDefinitions =
          managementService.createJobDefinitionQuery()
              .active()
              .processDefinitionId(processDefinition.getId())
              .list();

      for (JobDefinition jobDefinition : jobDefinitions) {
        // if you want to lookup the activity to highlight it inside the process diagram for example
        String activityId = jobDefinition.getActivityId();
        // if you want to display the configured expression / date / cron expression when the timer should fire
        String jobConfiguration = jobDefinition.getJobConfiguration();
        // if you want to distinguish between timer start event / catching timer intermediate event / boundary timer event
        String timerType = jobDefinition.getJobType();

        List<Job> jobs = managementService.createJobQuery()
            .active()
            .timers()
            .jobDefinitionId(jobDefinition.getId())
            .orderByJobDuedate()
            .list();

        timerJobsByProcessDefinition.put(processDefinition, jobs);
      }
    }

    return timerJobsByProcessDefinition;
  }
}

REST API 示例:

使用http://localhost:8080/engine-rest/process-definition/检索流程定义

对于每个流程定义,通过以下方式查询作业定义 http://localhost:8080/engine-rest/job-definition?active=true&processDefinitionId=${YOUR_PROCESS_DEFINITION_ID}

对于每个流程定义,通过 http://localhost:8080/engine-rest/job?active=true&timers=true&processDefinitionId=${YOUR_PROCESS_DEFINITION_ID} 查询作业

然后您必须使用 jobConfigurationId 将生成的作业与作业配置关联起来。

关于java - 如何查询预定进程(定时器事件)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22932730/

相关文章:

workflow-foundation - 状态机和工作流有什么区别?

grails - 在Grails上使用插件Activiti启动VacationRequestSampleApplication时出错

java - 如何使用 camunda 记录进程的状态?

Java floatToRawIntBits/intBitsToFloat 或 doubleToRawLongBits/longBitsToDouble 等同于 ruby​​?

java - 如何检查文件是否正在被读取

python - 在 python 中,如何运行一个在我向其发送 Ctrl+D 之前不返回的命令行程序

java - Jersey REST 客户端 - 多部分创建 - 不是来自 File 对象

java - 类型不兼容,需要 java.lang.Integer[],找到 Int[]?

java - Docker alpine + oracle java : cannot find java

java - 来自响应的 Internet Explorer Cookie 不会覆盖现有 Cookie