How to cleanly remove a custom job handler

Hi,

I was testing a custom job handler (trigger an event when dueDate expires) but now I undeployed it.
Now I cannot get the engine started due to an exception saying he cannot find the job handler.
It is my personal development server so no harm done but I was wondering;

Is there a clean way to remove such a job handler from the engine?

Kind regards

Stacktrace;

10:27:47,590 WARN  [org.camunda.bpm.engine.jobexecutor] (job-executor-tp-threads - 4) ENGINE-14002 Exception while executing job TimerEntity[repeat=null, id=10c0fb6c-2be0-11e6-97d3-ac87a3204ca5, revision=2, duedate=Wed Jun 08 14:13:23 CEST 2016, lockOwner=12e5739a-1600-43bd-b5e8-c5625f7045ee, lockExpirationTime=Fri Jun 10 10:32:47 CEST 2016, executionId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, processInstanceId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, isExclusive=true, retries=3, jobHandlerType=userTaskOverdueJob, jobHandlerConfiguration=null, exceptionByteArray=null, exceptionByteArrayId=null, exceptionMessage=null, deploymentId=36ac43d3-da0c-11e5-b93a-ac87a3204ca5]: Cannot find job handler 'userTaskOverdueJob' from job 'TimerEntity[repeat=null, id=10c0fb6c-2be0-11e6-97d3-ac87a3204ca5, revision=2, duedate=Wed Jun 08 14:13:23 CEST 2016, lockOwner=12e5739a-1600-43bd-b5e8-c5625f7045ee, lockExpirationTime=Fri Jun 10 10:32:47 CEST 2016, executionId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, processInstanceId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, isExclusive=true, retries=3, jobHandlerType=userTaskOverdueJob, jobHandlerConfiguration=null, exceptionByteArray=null, exceptionByteArrayId=null, exceptionMessage=null, deploymentId=36ac43d3-da0c-11e5-b93a-ac87a3204ca5]': jobHandler is null
10:27:47,590 ERROR [org.camunda.bpm.engine.context] (job-executor-tp-threads - 4) ENGINE-16004 Exception while closing command context: Cannot find job handler 'userTaskOverdueJob' from job 'TimerEntity[repeat=null, id=10c0fb6c-2be0-11e6-97d3-ac87a3204ca5, revision=2, duedate=Wed Jun 08 14:13:23 CEST 2016, lockOwner=12e5739a-1600-43bd-b5e8-c5625f7045ee, lockExpirationTime=Fri Jun 10 10:32:47 CEST 2016, executionId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, processInstanceId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, isExclusive=true, retries=3, jobHandlerType=userTaskOverdueJob, jobHandlerConfiguration=null, exceptionByteArray=null, exceptionByteArrayId=null, exceptionMessage=null, deploymentId=36ac43d3-da0c-11e5-b93a-ac87a3204ca5]': jobHandler is null: org.camunda.bpm.engine.exception.NullValueException: Cannot find job handler 'userTaskOverdueJob' from job 'TimerEntity[repeat=null, id=10c0fb6c-2be0-11e6-97d3-ac87a3204ca5, revision=2, duedate=Wed Jun 08 14:13:23 CEST 2016, lockOwner=12e5739a-1600-43bd-b5e8-c5625f7045ee, lockExpirationTime=Fri Jun 10 10:32:47 CEST 2016, executionId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, processInstanceId=10ac61ce-2be0-11e6-97d3-ac87a3204ca5, isExclusive=true, retries=3, jobHandlerType=userTaskOverdueJob, jobHandlerConfiguration=null, exceptionByteArray=null, exceptionByteArrayId=null, exceptionMessage=null, deploymentId=36ac43d3-da0c-11e5-b93a-ac87a3204ca5]': jobHandler is null
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) [rt.jar:1.8.0_77]
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) [rt.jar:1.8.0_77]
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) [rt.jar:1.8.0_77]
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423) [rt.jar:1.8.0_77]
	at org.camunda.bpm.engine.impl.util.EnsureUtil.generateException(EnsureUtil.java:329) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.util.EnsureUtil.ensureNotNull(EnsureUtil.java:49) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.util.EnsureUtil.ensureNotNull(EnsureUtil.java:44) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.persistence.entity.JobEntity.execute(JobEntity.java:123) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.cmd.ExecuteJobsCmd.execute(ExecuteJobsCmd.java:103) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.interceptor.CommandExecutorImpl.execute(CommandExecutorImpl.java:24) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:95) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.interceptor.JtaTransactionInterceptor.execute(JtaTransactionInterceptor.java:58) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:30) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.executeJob(ExecuteJobsRunnable.java:79) [camunda-engine-7.4.0.jar:7.4.0]
	at org.camunda.bpm.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:66) [camunda-engine-7.4.0.jar:7.4.0]
	at org.jboss.threads.SimpleDirectExecutor.execute(SimpleDirectExecutor.java:33)
	at org.jboss.threads.QueueExecutor.runTask(QueueExecutor.java:808)
	at org.jboss.threads.QueueExecutor.access$100(QueueExecutor.java:45)
	at org.jboss.threads.QueueExecutor$Worker.run(QueueExecutor.java:828)
	at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_77]
	at org.jboss.threads.JBossThread.run(JBossThread.java:122)

Hi @nvanbelle,

there is no Api for removing a custom job handler. The cause of your problem is that the existing job refer to your custom handler. In order to solve this, you can suspend / delete the job or update the jobHandlerType property.

Best regards,
Philipp