A (former) co-worker (thank you, M.O.!) found a solution, perhaps others find it useful: add a ProcessEnginePlugin
, a BpmnParseListener
, and your own global TaskListener
like this (not sure if all is necessary, hopefully I did not miss something):
ProcessEngineConfig:
@Configuration
public class ProcessEngineConfig {
...
@Bean
public ProcessEngineConfiguration processEngineConfiguration(PlatformTransactionManager transactionManager) {
SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();
...
configuration.getProcessEnginePlugins().add(myProcessEnginePlugin());
return configuration;
}
@Bean
public MyProcessEnginePlugin myProcessEnginePlugin() {
return new MyProcessEnginePlugin();
}
@Bean
public MyGlobalBpmnParseListener myGlobalBpmnParseListener() {
return new MyGlobalBpmnParseListener();
}
@Bean
public GlobalCreateTaskListener createTaskListener() {
return new GlobalCreateTaskListener();
}
}
MyProcessEnginePlugin:
public class MyProcessEnginePlugin extends AbstractProcessEnginePlugin {
@Autowired
private MyGlobalBpmnParseListener myGlobalBpmnParseListener;
public void preInit(ProcessEngineConfigurationImpl processEngineConfiguration) {
List<BpmnParseListener> preParseListeners = processEngineConfiguration.getCustomPreBPMNParseListeners();
if (preParseListeners == null) {
preParseListeners = new ArrayList<>();
processEngineConfiguration.setCustomPreBPMNParseListeners(preParseListeners);
}
preParseListeners.add(myGlobalBpmnParseListener);
}
}
GlobalTaskListener:
public interface GlobalTaskListener extends TaskListener {
}
MyGlobalBpmnParseListener:
public class MyGlobalBpmnParseListener extends AbstractBpmnParseListener {
@Autowired(required = false)
private List<GlobalTaskListener> globalTaskListeners;
@Override
public void parseUserTask(Element userTaskElement, ScopeImpl scope, ActivityImpl activity) {
if (globalTaskListeners != null) {
UserTaskActivityBehavior activityBehavior = (UserTaskActivityBehavior) activity.getActivityBehavior();
TaskDefinition taskDefinition = activityBehavior.getTaskDefinition();
for (GlobalTaskListener globalTaskListener : globalTaskListeners) {
taskDefinition.addTaskListener(TaskListener.EVENTNAME_ASSIGNMENT, globalTaskListener);
taskDefinition.addTaskListener(TaskListener.EVENTNAME_CREATE, globalTaskListener);
taskDefinition.addTaskListener(TaskListener.EVENTNAME_COMPLETE, globalTaskListener);
taskDefinition.addTaskListener(TaskListener.EVENTNAME_DELETE, globalTaskListener);
}
}
}
}
GlobalCreateTaskListener:
public class GlobalCreateTaskListener implements GlobalTaskListener {
@Override
public void notify(DelegateTask delegateTask) {
// delegateTask.getEventName() should be one of TaskListener.EVENTNAME_*
}
}