protected EventExecution execute(EventExecution eventExecution, Action action, Object payload) {
        try {
            LOGGER.debug(
                    "Executing action: {} for event: {} with messageId: {} with payload: {}",
                    action.getAction(),
                    eventExecution.getId(),
                    eventExecution.getMessageId(),
                    payload);

            // TODO: Switch to @Retryable annotation on SimpleActionProcessor.execute()
            Map<String, Object> output =
                    retryTemplate.execute(
                            context ->
                                    actionProcessor.execute(
                                            action,
                                            payload,
                                            eventExecution.getEvent(),
                                            eventExecution.getMessageId()));
            if (output != null) {
                eventExecution.getOutput().putAll(output);
            }
            eventExecution.setStatus(Status.COMPLETED);
            Monitors.recordEventExecutionSuccess(
                    eventExecution.getEvent(),
                    eventExecution.getName(),
                    eventExecution.getAction().name());
        } catch (RuntimeException e) {
            LOGGER.error(
                    "Error executing action: {} for event: {} with messageId: {}",
                    action.getAction(),
                    eventExecution.getEvent(),
                    eventExecution.getMessageId(),
                    e);
            if (!isTransientException(e)) {
                // not a transient error, fail the event execution
                eventExecution.setStatus(Status.FAILED);
                eventExecution.getOutput().put("exception", e.getMessage());
                Monitors.recordEventExecutionError(
                        eventExecution.getEvent(),
                        eventExecution.getName(),
                        eventExecution.getAction().name(),
                        e.getClass().getSimpleName());
            }
        }
        return eventExecution;
    }
@param eventExecution the instance of {@link EventExecution}
@param action the {@link Action} to be executed for the event
@param payload the {@link Message#getPayload()}
@return the event execution updated with execution output, if the execution is
    completed/failed with non-transient error the input event execution, if the execution
    failed due to transient error
core/src/main/java/com/netflix/conductor/core/events/DefaultEventProcessor.java