Exception with timer Event

Hi,

at the moment we have some problems with jobs. We have a bpmn 2.0 workflow with a user task and an attached interrupted timer event. This means: In case the user is not acting in a predefined period of time,
the process instance will be finished automatically. For the timer event we configured a Listener, with Listener Type “Java Class”.

We can see that in table act_ru_job a new job row is created, as soon a the token reaches the task “zustimmen”. However, as soon as the configured time is reached, we get the following exception
“ENGINE-09008 Exception while instantiating class ‘intranet.bpmn.eProcurement.servicetask.ZustimmungAbgelaufenListener’:
ENGINE-09017 Cannot load class ‘intranet.bpmn.eProcurement.servicetask.ZustimmungAbgelaufenListener’: intranet.bpmn.eProcurement.servicetask.ZustimmungAbgelaufenListener
from [Module “org.camunda.bpm.camunda-engine:main”
from local module loader @64881d (finder: local module finder @244f19 (roots: /opt/jboss/6/modules,/opt/jboss/6/modules/system/layers/base))]”.

In Camunda Cockpit it looks as follows:

BpmnError

We also tried to use Listener Type “Delegate Expression”, but unfortunately the class still can’t be found.

We are using JBoss 6.2 and the Workflow Engine Camunda 7.7.0 is installed as a shared engine.

What are we doing wrong?

Hi @ali,

How do you deploy code and processes (e.g. are both in a process application? Code in process application but process deployment via REST? Code deployed in a shared classpath? etc.)?

Cheers,
Thorben

Hi @thorben,
we deploy the process definition via repositoryService:

Deployment deployment = processEngine.getRepositoryService().createDeployment().name("DummyName").addInputStream(
                            prozessName,
                            byteArrayInputStream
                    ).deploy();

After reading your post, we found the information to register the deployment with the process Application:

processEngine.getManagementService().registerProcessApplication(deploymentID, processApplication.getReference());

We added the last 2 lines to the processes.xml :

<process-archive name="dummy">
	<process-engine>default</process-engine>
	<properties>
		<property name="isDeleteUponUndeploy">false</property>
		<property name="isScanForProcessDefinitions">false</property>
		<property name="isResumePreviousVersions">true</property>
		<property name="resumePreviousBy">deployment-name</property>
	</properties>
</process-archive> 

But after restarting the JBoss application server the following call:

defaultProcessApplicationManager.getRegistrationSummary();

gives no result. So the registry seems not to work?

We tried this again, but the result with therse changes is the same.

Registrations are not persisted. You need to recreate them whenever you redeploy the application.

Cheers,
Thorben

  1. The classloader problem exists even with the registered workflow definition (tested without restarting the process application, with registered state)
  2. we thought that the recreation of the registration works with the “resumePreviousBy”-property. Is this assumption correct?
    How do you recreate the registration on server startup?

Feel free to provide a minimal example on github, so that I can see for myself.

This only applies to resources deployed via the process application deployment, i.e. things declared in processes.xml. For those resources, the process engine checks for any previous deployments to be resumed.

You can do that by calling the registration API again. You will have to somehow reconstruct the relationship between deployment and application, e.g. by storing it somewhere or by encoding it in the deployment name or similar.