{"record":{"id":"1a421566919d2535","repo":"flowable/flowable-engine","slug":"no-job-handler-registered-for-type","errorCode":null,"errorMessage":"No job handler registered for type ","messagePattern":"No job handler registered for type ","errorType":"exception","errorClass":"FlowableException","httpStatus":null,"severity":"error","filePath":"modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/asyncexecutor/DefaultJobManager.java","lineNumber":556,"sourceCode":"    protected void executeJobHandler(JobEntity jobEntity) {\n        VariableScope variableScope = null;\n        if (jobServiceConfiguration.getInternalJobManager() != null) {\n            variableScope = jobServiceConfiguration.getInternalJobManager().resolveVariableScope(jobEntity);\n        }\n        \n        if (variableScope == null) {\n            variableScope = NoExecutionVariableScope.getSharedInstance();\n        }\n\n        Map<String, JobHandler> jobHandlers = jobServiceConfiguration.getJobHandlers();\n        if (jobEntity.getJobHandlerType() != null) {\n            \n            if (jobHandlers != null) {\n                JobHandler jobHandler = jobHandlers.get(jobEntity.getJobHandlerType());\n                if (jobHandler != null) {\n                    jobHandler.execute(jobEntity, jobEntity.getJobHandlerConfiguration(), variableScope, getCommandContext());\n                } else {\n                    throw new FlowableException(\"No job handler registered for type \" + jobEntity.getJobHandlerType() + \n                                    \" in job config for engine: \" + jobServiceConfiguration.getEngineName() + \" for \" + jobEntity);\n                }\n                \n            } else {\n                throw new FlowableException(\"No job handler registered for type \" + jobEntity.getJobHandlerType() +\n                                \" in job config for engine: \" + jobServiceConfiguration.getEngineName() + \" for \" + jobEntity);\n            }\n            \n        } else {\n            throw new FlowableException(jobEntity + \" has no job handler type in job config for engine: \" + jobServiceConfiguration.getEngineName());\n        }\n    }\n\n    protected void executeHistoryJobHandler(HistoryJobEntity historyJobEntity) {\n        Map<String, HistoryJobHandler> jobHandlers = jobServiceConfiguration.getHistoryJobHandlers();\n        if (historyJobEntity.getJobHandlerType() != null) {\n            if (jobHandlers != null) {\n                HistoryJobHandler jobHandler = jobHandlers.get(historyJobEntity.getJobHandlerType());","sourceCodeStart":538,"sourceCodeEnd":574,"githubUrl":"https://github.com/flowable/flowable-engine/blob/d6d39ce1c69ff244f2d9dc6af756a9b95e865586/modules/flowable-job-service/src/main/java/org/flowable/job/service/impl/asyncexecutor/DefaultJobManager.java#L538-L574","documentation":"executeJobHandler looks up the job's handler type in the engine's registered JobHandler map. When the map is populated but the specific jobEntity.getJobHandlerType() has no matching handler, Flowable throws this FlowableException naming the type and engine. Every job created must have a handler registered in the process engine configuration.","triggerScenarios":"A JobEntity with a jobHandlerType (e.g. 'async-continuation', 'timer', custom handler) that is not present in the JobServiceConfiguration's jobHandlers map when executeMessageJob or executeTimerJob runs the job.","commonSituations":"Custom JobHandler implementations not registered via the engine configuration's customJobHandlers; jobs persisted by a newer/other Flowable version whose handler types the current engine does not know; classpath issues dropping handler registrations.","solutions":["Register the missing handler: add it to the process engine configuration (ProcessEngineConfigurationImpl.setCustomJobHandlers or the job service configuration's job handler map).","Verify the jobHandlerType string stored on the job row against the keys of the registered jobHandlers map.","Align engine versions if jobs were created by a different Flowable version (check ACT_RU_JOB JOB_HANDLER_TYPE values).","Check for errors in engine bootstrap logs indicating handler registration failures."],"exampleFix":"// before\nProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(\"flowable.cfg.xml\");\n// custom handler never registered\n\n// after\nProcessEngineConfigurationImpl cfg = (ProcessEngineConfigurationImpl)\n    ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(\"flowable.cfg.xml\");\nList<JobHandler> handlers = new ArrayList<>();\nhandlers.add(new MyCustomJobHandler());\ncfg.setCustomJobHandlers(handlers);","handlingStrategy":"validation","validationCode":"Map<String, JobHandler> handlers = jobServiceConfiguration.getJobHandlers();\nif (handlers == null || !handlers.containsKey(job.getJobHandlerType())) {\n    throw new IllegalStateException(\"Unregistered job handler type: \" + job.getJobHandlerType());\n}","typeGuard":null,"tryCatchPattern":"try { jobManager.executeMessageJob(job); } catch (FlowableException e) { if (e.getMessage().startsWith(\"No job handler registered\")) { registerMissingHandlerAndRetry(job); } else throw e; }","preventionTips":["Register all custom JobHandlers in process engine configuration at bootstrap.","Keep job-handler registrations in one configuration module shared by all nodes.","Verify handler keys match jobHandlerType strings in the job tables after upgrades.","Smoke-test engine startup by executing one job of each handler type."],"tags":["flowable","job-handler","missing-registration","configuration"],"backgroundTag":"missing-dependency","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"}