{"record":{"id":"e70a41ee6afed91e","repo":"flowable/flowable-engine","slug":"io-exception-occurred-e70a41","errorCode":null,"errorMessage":"IO exception occurred","messagePattern":"IO exception occurred","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-http-common/src/main/java/org/flowable/http/common/api/client/AsyncExecutableHttpRequest.java","lineNumber":39,"sourceCode":"\n/**\n * @author Filip Hrisafov\n */\npublic interface AsyncExecutableHttpRequest extends ExecutableHttpRequest {\n\n    @Override\n    default HttpResponse call() {\n        try {\n            return callAsync().get();\n        } catch (InterruptedException e) {\n            Thread.currentThread().interrupt();\n            throw new FlowableException(\"Call was interrupted\", e);\n        } catch (ExecutionException e) {\n            Throwable cause = e.getCause();\n            if (cause instanceof RuntimeException) {\n                throw (RuntimeException) cause;\n            } else if (cause instanceof IOException) {\n                throw new FlowableException(\"IO exception occurred\", cause);\n            } else {\n                throw new FlowableException(\"execution exception\", cause);\n            }\n        }\n    }\n\n    CompletableFuture<HttpResponse> callAsync();\n}\n","sourceCodeStart":21,"sourceCodeEnd":48,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-http-common/src/main/java/org/flowable/http/common/api/client/AsyncExecutableHttpRequest.java#L21-L48","documentation":"When the asynchronous HTTP call completes exceptionally with an IOException, call() unwraps the ExecutionException and rethrows the cause wrapped in a FlowableException with message \"IO exception occurred\". It signals a transport-level failure of the HTTP request.","triggerScenarios":"callAsync().get() throws ExecutionException whose cause is a java.io.IOException — e.g. connection reset, DNS failure, socket timeout, or stream errors inside the async HTTP client.","commonSituations":"Target host unreachable or firewall blocking the port; TLS handshake failures; server closing connections; network outages in containerized/Kubernetes environments; wrong proxy configuration.","solutions":["Inspect the cause chain (getCause()) for the concrete IOException and fix connectivity (host, port, DNS, proxy, TLS).","Retry the request with backoff if the failure is transient (connection reset, timeout).","Catch FlowableException around call() and fall back to an alternative endpoint or error handling path in the flow."],"exampleFix":"// before\nHttpResponse response = request.call();\n\n// after\ntry {\n    HttpResponse response = request.call();\n} catch (FlowableException e) {\n    logger.warn(\"HTTP IO failure\", e);\n    // retry or fallback\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    HttpResponse response = request.call();\n} catch (FlowableException e) {\n    Throwable cause = e.getCause();\n    if (cause instanceof IOException) {\n        // log and retry with exponential backoff, or fail over to backup endpoint\n    }\n}","preventionTips":["Verify target host, port, DNS and proxy settings before deployment","Set explicit connect/read timeouts on the HTTP client","Implement retry with backoff for transient IO failures","Monitor network paths (firewalls, service meshes) between engine and endpoint"],"tags":["http","io","network","async"],"backgroundTag":"network-request-failed","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-18T11:17:12.947Z"}