Table of Contents
JPDL specifies an xml schema and the mechanism to package all the process definition related files into a process archive.
A process archive is a zip file. The central file in the process archive is
processdefinition.xml
. The main information in that file is
the process graph. The processdefinition.xml
also contains
information about actions and tasks. A process archive can also contain other
process related files such as classes, ui-forms for tasks, ...
Deploying process archives can be done in 3 ways: with the process designer tool, with an ant task or programatically.
Deploying a process archive with the designer tool is supported in the starters-kit. Right click on the process archive folder to find the "Deploy process archive" option. The starters-kit server contains the jBPM webapp, which has a servlet to upload process archives called ProcessUploadServlet. This servlet is capable of uploading process archives and deploying them to the default jBPM instance configured.
Deploying a process archive with an ant task can be done as follows:
<target name="deploy.par"> <taskdef name="deploypar" classname="org.jbpm.ant.DeployProcessTask"> <classpath --make sure the jbpm-[version].jar is in this classpath--/> </taskdef> <deploypar par="build/myprocess.par" /> </target>
To deploy more process archives at once, use the nested fileset elements. The file attribute itself is optional. Other attributes of the ant task are:
Process archives can also be deployed programmatically with the class
org.jbpm.jpdl.par.ProcessArchiveDeployer
What happens when we have a process definition deployed, many executions are not yet finished and we have a new version of the process definition that we want to deploy ?
Process instances always execute to the process definition that they are started in. But jBPM allows for multiple process definitions of the same name to coexist in the database. So typically, a process instance is started in the latest version available at that time and it will keep on executing in that same process definition for its complete lifetime. When a newer version is deployed, newly created instances will be started in the newest version, while older process instances keep on executing in the older process defintions.
If the process includes references to Java classes, the java classes can be
made available to the jBPM runtime environment in 2 ways : by making sure these
classes are visible to the jBPM classloader. This usually means that you can
put your delegation classes in a .jar
file next to the
jbpm-[version].jar
. In that case, all the process definitions
will see that same class file. The java classes can also be included
in the process archive. When you include your delegation classes in the process
archive (and they are not visible to the jbpm classloader), jBPM will also version
these classes inside the process definition. More information about process classloading
can be found in the section called “Delegation”
When a process archive gets deployed, it creates a process definition in the jBPM database. Process definitions can be versioned on the basis of the process definition name. When a named process archive gets deployed, the deployer will assign a version number. To assign this number, the deployer will look up the highest version number for process definitions with the same name and adds 1. Unnamed process definitions will always have version number -1.
Changing process definitions after they are deployed into the jBPM database has many potential pitfalls. Therefor, this is highly discouraged.
Actually, there is a whole variety of possible changes that can be made to a process definition. Some of those process definitions are harmless, but some other changes have implications far beyond the expected and desirable.
So please consider migrating process instances to a new definition over this approach.
In case you would consider it, these are the points to take into consideration:
Use hibernate's update: You can
just load a process definition, change it and save it with the
hibernate session. The hibernate session can be accessed with
the method JbpmContext.getSession()
.
The second level cache: A process definition would need to be removed from the second level cache after you've updated an existing process definition. See also the section called “Second level cache”
An alternative approach to changing process definitions might be to convert the executions to a new process definition. Please take into account that this is not trivial due to the long-lived nature of business processes. Currently, this is an experimental area so for which there are not yet much out-of-the-box support.
As you know there is a clear distinction between process definition data, process instance data (the runtime data) and the logging data. With this approach, you create a separate new process definition in the jBPM database (by e.g. deploying a new version of the same process). Then the runtime information is converted to the new process definition. This might involve a translation cause tokens in the old process might be pointing to nodes that have been removed in the new version. So only new data is created in the database. But one execution of a process is spread over two process instance objects. This might become a bit tricky for the tools and statistics calculations. When resources permit us, we are going to add support for this in the future. E.g. a pointer could be added from one process instance to it's predecessor.