flowable/flowable-engine · error · FlowableException

execution exception

Error message

execution exception

What it means

Fallback branch of AsyncExecutableHttpRequest.call(): when the async call fails with a cause that is neither a RuntimeException nor an IOException, it is wrapped in a FlowableException with the message "execution exception". It surfaces any unexpected checked failure from the underlying async client.

Solutions

  1. Read the cause via e.getCause() to identify the actual underlying exception type and fix that root problem.
  2. If the cause indicates client misconfiguration (TLS, protocol), correct the async client configuration.
  3. Report/upgrade if a new exception type from the HTTP client should be mapped to a dedicated branch.
Defensive patterns

Strategy: try-catch

Try / catch

try {
    HttpResponse response = request.call();
} catch (FlowableException e) {
    Throwable cause = e.getCause();
    if (cause != null && !(cause instanceof RuntimeException) && !(cause instanceof IOException)) {
        logger.error("Unexpected async execution failure", cause);
    }
}

Prevention

When it happens

Trigger: callAsync().get() throws ExecutionException whose cause is neither RuntimeException nor IOException — e.g. a checked client-specific exception (SSL/protocol errors wrapped as custom types, InterruptedException subtypes, custom client errors).

Common situations: Misconfigured async HTTP client throwing a library-specific checked exception; serialization/deserialization layers throwing unexpected checked exceptions; upgrading the HTTP client introduces new exception types not covered by the narrower branches.

Understand the failure class

Background: 'Something went wrong' / 'Request failed (500)' / 'HTTP error! status: 404' — what failed HTTP requests actually mean and how to find the real cause — this error's family across 28 libraries.

Related errors


AI-assisted analysis of flowable/flowable-engine@d6d39ce1c6 (2026-09-11). Data as JSON: /api/errors/31911b5da6f0d79e. Report an issue: GitHub.

Appendix: source

Thrown at modules/flowable-http-common/src/main/java/org/flowable/http/common/api/client/AsyncExecutableHttpRequest.java:41

 * @author Filip Hrisafov
 */
public interface AsyncExecutableHttpRequest extends ExecutableHttpRequest {

    @Override
    default HttpResponse call() {
        try {
            return callAsync().get();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
            throw new FlowableException("Call was interrupted", e);
        } catch (ExecutionException e) {
            Throwable cause = e.getCause();
            if (cause instanceof RuntimeException) {
                throw (RuntimeException) cause;
            } else if (cause instanceof IOException) {
                throw new FlowableException("IO exception occurred", cause);
            } else {
                throw new FlowableException("execution exception", cause);
            }
        }
    }

    CompletableFuture<HttpResponse> callAsync();
}

View on GitHub (pinned to d6d39ce1c6)