根据Camunda的文档(https://docs.camunda.org/manual/latest/user-guide/process-applications/process-application-event-listeners/),可以将“全局”事件处理程序(ExecutionListener或TaskListener)添加到ProcessApplication
。
尽管如此,我还是找不到在运行时添加类似(“全局”)事件处理程序的方法。此功能在Activiti中使用引擎addEventListener
(https://www.activiti.org/javadocs/org/activiti/engine/RuntimeService.html#addEventListener-org.activiti.engine.delegate.event.ActivitiEventListener-)的方法RuntimeService
出现,但在Camunda的RuntimeService
中不再出现。
如何在运行时添加“全局”事件处理程序?
注意:由于我想从其他库中添加处理程序,因此无法修改将添加事件处理程序的ProcessApplication
。
谢谢大家,
答案 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上不可用。
正如文档所述,您可以定义一个返回全局执行/任务侦听器的流程应用程序。要在运行时定义流程应用程序,您可以使用EmbeddedProcessApplication
和ManagementService#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());