在Camunda中的运行时添加事件处理程序(ExecutionListener或TaskListener)

时间:2017-04-19 10:14:06

标签: java activiti bpm camunda

根据Camunda的文档(https://docs.camunda.org/manual/latest/user-guide/process-applications/process-application-event-listeners/),可以将“全局”事件处理程序(ExecutionListener或TaskListener)添加到ProcessApplication

尽管如此,我还是找不到在运行时添加类似(“全局”)事件处理程序的方法。此功能在Activiti中使用引擎addEventListenerhttps://www.activiti.org/javadocs/org/activiti/engine/RuntimeService.html#addEventListener-org.activiti.engine.delegate.event.ActivitiEventListener-)的方法RuntimeService出现,但在Camunda的RuntimeService中不再出现。

如何在运行时添加“全局”事件处理程序?
注意:由于我想从其他库中添加处理程序,因此无法修改将添加事件处理程序的ProcessApplication

谢谢大家,

2 个答案:

答案 0 :(得分:3)

社区扩展camunda-bpm-reactor允许您注册每次触发侦听器时为事件提供事件的事件总线。然后,您可以在这些事件上注册侦听器。所以bpmn和监听器代码在运行时耦合。

@CamundaSelector(type = "userTask", event = TaskListener.EVENTNAME_CREATE)
public class TaskCreateListener implements TaskListener {

   public TaskCreateListener(EventBus eventBus) {
     eventBus.register(this);
   }

   @Override
   public void notify(DelegateTask delegateTask) {
      ...
   }
}

答案 1 :(得分:1)

我认为在Camunda分叉活动之后添加了Activiti方法addEventListener,这就是为什么这个方法在Camunda的RuntimeService上不可用。

正如文档所述,您可以定义一个返回全局执行/任务侦听器的流程应用程序。要在运行时定义流程应用程序,您可以使用EmbeddedProcessApplicationManagementService#registerProcessApplication方法。

参见以下示例:

EmbeddedProcessApplication processApplication = new EmbeddedProcessApplication() {
  public ExecutionListener getExecutionListener() {
    return new ExecutionListener() {
      public void notify(DelegateExecution execution) throws Exception {
      // do your stuff       
      }              
    };
  }
};

// register app so that it is notified about events
managementService.registerProcessApplication(deploymentId, processApplication.getReference());