Design Diagrams

Product Components

Process definition and instance

Node hierarchy

Asynchronous node

Timer

Project Modules

Database schema scripts for every version (since 3.2.2), plus the scripts to generate the new jBPM DB schema scripts for every new version when it is being released.

distribution

Product installer. The idea was that this installer would be the interface between the project and the product. Instead, the SOA platform build does an automated installation and then a script cherry picks files from the installation.

enterprise

Message and scheduler services based on JMS and EJB timers respectively. Those services are not used in the product. Instead, the JCA inflow services are used.

examples

Sample processes that ship with the product.

identity

Identity component containing the classes for users, groups and memberships.

simulation

Process analysis and optimization tool donated by Camunda GmbH. Not part of the product.

userguide

User guide in the docbook format. Note that these docs are decoupled from the product docs. Changes must be propagated to the docs team separately.

Tooling Interfaces

Graphical process designer

GPD depends on the file src/main/etc/version.info.xml in the distribution module. This file contains the locations of the jar files that are needed to create a new project. The tooling expects the following folder layout:

Directory

Contents

lib

binaries and dependencies

src

source jars

config

configuration resources

examples

sample processes

For deployment, a servlet that accepts process archives with file upload has to be configured. This features was only added for usage during development. So after we found out that this imposed a security problem, then we proposed to remove the servlet. But the latest product decision was to secure the servlet.

Web console

The console just uses the jBPM 3 API and libraries directly and it should be configured to connect to a data source.

Database

Compatibility

jBPM uses Hibernate as ORM framework. This means that, theoretically, jBPM is compatible with any Hibernate-compatible database (ie any database for which there exists a Hibernate dialect). However, extensive compatibility testing is done on the databases which are listed as certified databases for the SOA-P (and more).

Execution data

JBPM_PROCESSINSTANCE: general data about an execution of a process definition.

JBPM_TOKEN: stores the actual pointers that indicate the current state of a process instance. The jBPM model is based on a hierarchical tree of tokens. The JBPM_PROCESSINSTANCE table refers to a so-called 'root-token' that is created when the process instance is created. The tree of tokens can be constructed using this token-rootToken-processInstance relationship.

JBPM_VARIABLEINSTANCE: runtime data in the form of process variables are stored in this table. Multiple columns such as 'datevalue_', 'longvalue_', 'stringvalue_', etc are used to store the actual variables depending on the variable types.

JBPM_POOLEDACTOR/JBPM_TASKACTORPOOL: when task assignment expressions resolve to a group of actors (a so-called 'pool of actors'), the runtime evaluations are stored in these two tables.

JBPM_JOB: stores runtime job information that is used to execute jobs, and in particular asynchronous continuations of process logic, by the job executor.

JBPM_TIMER: timers are a specific type of jobs that are executable by the jBPM job executor. However, timers need additional information such as 'transitionName' (transition taken when te timer fires), the task to which the timer is attached to, etc. All this extra runtime information is stored in this table.

JBPM_LOG: generic table that contains all historical/audit data generated by the jBPM engine. This table has quite some columns to store the different types of historical events. At runtime, this table can get seriously big, and maintenance scripts should be developed to keep performance decent.

API Usage

Starting a process instance

Signaling a token

Retrieving a task list

Test Coverage

Continuous integration

The project leverages the Hudson installation maintained by JBoss QA. The codebase also provides scripts and configuration files to set up a local Hudson server useful for troubleshooting purposes. Visit jBPM3 Hudson Setup for a step-by-step guide.

Areas of attention

From support cases, our experience is that only one set of tests is lacking: Controlled concurrency testing. Though those are not easy to set up. This means that we need to simulate in a controlled fashion optimistic locking exceptions. One test thread should control multiple threads (at minimal 2), each performing some competing operation on jBPM. For example, a signal and a timer that are performed on the same token. Those then should lead to a hibernate optimistic locking exception and then a rollback of one of those transactions. Depending on the DB implementation of locking, deadlocks could arise as well. Analyzing which of those situations can occur and building controlled tests for those is the next effort that should be done for jBPM to be able to better support the product. Also the join behavior should get attention in this context. Then these tests should be executed on all databases so that those different behaviors can be analyzed and documented.

A significant amount of research is necessary to explore this path. One direction we've been thinking about is using the java debugger capabilities to achieve this. In that case, the unit test could pretend to be a debugging tool that puts breakpoints and steers the execution in a controlled fashion to optimistic locking exceptions.