{"record":{"id":"ea0aa69591197ba8","repo":"flowable/flowable-engine","slug":"error-reading-json-value-configuration-for-ea0aa6","errorCode":null,"errorMessage":"Error reading json value \" + configuration + \" for \" + job","messagePattern":"Error reading json value \" \\+ configuration \\+ \" for \" \\+ job","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-engine/src/main/java/org/flowable/engine/impl/jobexecutor/TimerSuspendProcessDefinitionHandler.java","lineNumber":46,"sourceCode":"public class TimerSuspendProcessDefinitionHandler extends TimerChangeProcessDefinitionSuspensionStateJobHandler {\n\n    public static final String TYPE = \"suspend-processdefinition\";\n\n    @Override\n    public String getType() {\n        return TYPE;\n    }\n\n    @Override\n    public void execute(JobEntity job, String configuration, VariableScope variableScope, CommandContext commandContext) {\n        ProcessEngineConfigurationImpl processEngineConfiguration = CommandContextUtil.getProcessEngineConfiguration(commandContext);\n        \n        boolean suspendProcessInstances = false;\n        try {\n            JsonNode configNode = processEngineConfiguration.getObjectMapper().readTree(configuration);\n            suspendProcessInstances = getIncludeProcessInstances(configNode);\n        } catch (Exception e) {\n            throw new FlowableException(\"Error reading json value \" + configuration + \" for \" + job, e);\n        }\n\n        String processDefinitionId = job.getProcessDefinitionId();\n\n        SuspendProcessDefinitionCmd suspendProcessDefinitionCmd = new SuspendProcessDefinitionCmd(processDefinitionId, null, suspendProcessInstances, null, job.getTenantId());\n        suspendProcessDefinitionCmd.execute(commandContext);\n    }\n\n}\n","sourceCodeStart":28,"sourceCodeEnd":56,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-engine/src/main/java/org/flowable/engine/impl/jobexecutor/TimerSuspendProcessDefinitionHandler.java#L28-L56","documentation":"Thrown by TimerSuspendProcessDefinitionHandler.execute when the suspend-timer job's JSON configuration cannot be parsed. Mirrors the activate handler: it reads includeProcessInstances from the config JSON before running SuspendProcessDefinitionCmd.","triggerScenarios":"A timer-suspension job whose CONFIGURATION_ string is malformed JSON or unreadable, throwing in readTree(...) and wrapped in this FlowableException.","commonSituations":"Manual DB edits to job configuration, schema changes across Flowable versions, or jobs created by a different engine version.","solutions":["Correct the CONFIGURATION_ JSON (e.g. {\"includeProcessInstances\":false})","Recreate the timer job by redeploying the process definition","Examine the wrapped cause for the exact JSON parse error"],"exampleFix":"// before\n-- UPDATE ACT_RU_JOB SET CONFIGURATION_ = 'suspend: true' ...\n// after\n-- UPDATE ACT_RU_JOB SET CONFIGURATION_ = '{\"includeProcessInstances\":false}' ...","handlingStrategy":"try-catch","validationCode":"try { new ObjectMapper().readTree(configuration); } catch (Exception e) { /* repair job configuration JSON */ }","typeGuard":null,"tryCatchPattern":"try { /* timer fires */ } catch (FlowableException e) { if (e.getMessage().startsWith(\"Error reading json value\")) { /* fix CONFIGURATION_ JSON or recreate job */ } else throw e; }","preventionTips":["Validate job configuration JSON whenever jobs are created or migrated","Test suspension timers after Flowable version upgrades"],"tags":["flowable","timer","json","suspend"],"backgroundTag":"json-parse-error","analyzedSha":"d6d39ce1c69ff244f2d9dc6af756a9b95e865586","analyzedAt":"2026-09-11T06:41:19.413Z","contentChangedAt":"2026-09-11T06:41:19.413Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}