{"record":{"id":"732e32a5e075c569","repo":"Activiti/Activiti","slug":"unable-to-read-process-extension","errorCode":null,"errorMessage":"Unable to read process extension","messagePattern":"Unable to read process extension","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"activiti-core/activiti-spring-resource-loader/src/main/java/org/activiti/spring/resources/DeploymentResourceLoader.java","lineNumber":68,"sourceCode":"            resources = new ArrayList<>();\n        }\n        return resources;\n    }\n\n    private List<T> loadResources(\n        String deploymentId,\n        ResourceReader<T> resourceReader,\n        List<String> selectedResources\n    ) {\n        List<T> resources = new ArrayList<>();\n        for (String name : selectedResources) {\n            try (InputStream resourceAsStream = repositoryService.getResourceAsStream(deploymentId, name)) {\n                T resource = resourceReader.read(resourceAsStream);\n                if (resource != null) {\n                    resources.add(resource);\n                }\n            } catch (IOException e) {\n                throw new IllegalStateException(\"Unable to read process extension\", e);\n            }\n        }\n        return resources;\n    }\n\n    public void setRepositoryService(RepositoryService repositoryService) {\n        this.repositoryService = repositoryService;\n    }\n}\n","sourceCodeStart":50,"sourceCodeEnd":78,"githubUrl":"https://github.com/Activiti/Activiti/blob/56435b1a97deeafdc09dd40074b056c89fba5a8a/activiti-core/activiti-spring-resource-loader/src/main/java/org/activiti/spring/resources/DeploymentResourceLoader.java#L50-L78","documentation":"DeploymentResourceLoader.loadResources() streams each deployment resource from the repository via repositoryService.getResourceAsStream() and deserializes it with the configured ResourceReader. An IOException while reading the stream is converted to an IllegalStateException with this message. It means a deployment resource could not be read from the process engine's resource store.","triggerScenarios":"Calling loadResources/loadResourcesForDeployment when the underlying repository IO fails while streaming a resource for the given deploymentId — e.g. the resource bytes are missing in storage or the stream is broken.","commonSituations":"Database/storage failures under ACT_GE_BYTEARRAY, partially deleted or corrupted deployments, or a custom ResourceReader that mishandles the stream.","solutions":["Check the wrapped IOException root cause and fix the underlying storage/database problem.","Verify the deployment and its resources exist and are intact in the repository tables.","Redeploy the process definitions to recreate healthy resources.","Ensure the ResourceReader implementation does not itself break or close the stream prematurely."],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n    List<MyResource> resources = loader.loadResourcesForDeployment(deploymentId);\n} catch (IllegalStateException e) {\n    if (e.getMessage() != null && e.getMessage().contains(\"Unable to read process extension\")) {\n        log.error(\"Repository IO failure for deployment \" + deploymentId, e.getCause());\n    } else {\n        throw e;\n    }\n}","preventionTips":["Monitor repository storage/database health for the process engine.","Do not manually delete ACT_GE_BYTEARRAY rows.","Redeploy deployments that show read errors instead of patching data.","Keep custom ResourceReader implementations defensive against partial streams."],"tags":["io","deployment-resources","repository","spring"],"backgroundTag":"file-read-failed","analyzedSha":"56435b1a97deeafdc09dd40074b056c89fba5a8a","analyzedAt":"2026-09-09T21:00:06.703Z","contentChangedAt":"2026-09-09T21:00:06.703Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}