Create Execution Listener in Spring[Modified]

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_*
  }
}