Backend Development 18 min read

Activiti Workflow Engine: Concepts, Configuration, and Hands‑On Java Examples

This article explains what a workflow is, introduces the Activiti 7 workflow engine, walks through environment setup with Maven and MySQL, and provides complete Java code examples for initializing tables, deploying processes, starting instances, querying definitions, deleting deployments, and retrieving BPMN/PNG resources.

Top Architect
Top Architect
Top Architect
Activiti Workflow Engine: Concepts, Configuration, and Hands‑On Java Examples

1. What is a workflow – A workflow automates business processes by passing documents, information, or tasks among participants according to predefined rules to achieve a business goal.

2. Activiti 7 Overview – Activiti is an open‑source BPMN 2.0 workflow engine that externalizes process management from business code, reducing upgrade effort and improving robustness.

3. Environment configuration – Create a MySQL database, add Maven dependencies (activiti‑engine, activiti‑spring, MySQL driver, Log4j, SLF4J, MyBatis, Commons‑DBCP, JUnit), and define activiti.cfg.xml and Spring beans for the data source and StandaloneProcessEngineConfiguration . The configuration sets databaseSchemaUpdate="true" to auto‑create the required tables.

4. Initializing Activiti tables

public class ActivitiInit {
    @Test
    public void GenActivitiTables() {
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(
                "activiti.cfg.xml", "processEngineConfiguration");
        ProcessEngine engine = cfg.buildProcessEngine();
        System.out.println(engine);
    }

    @Test
    public void GenActivitiTables2() {
        ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
        System.out.println(engine);
    }
}

5. Deploying a process definition

@Test
public void activitiDeploymentTest() {
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repo = engine.getRepositoryService();
    Deployment deployment = repo.createDeployment()
        .addClasspathResource("diagram/holiday.bpmn")
        .addClasspathResource("diagram/holiday.png")
        .name("请假申请单流程")
        .deploy();
    System.out.println(deployment.getName());
    System.out.println(deployment.getId());
}

@Test
public void activitiDeploymentTest2() {
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repo = engine.getRepositoryService();
    InputStream is = ActivitiDeployment.class.getClassLoader()
        .getResourceAsStream("diagram/holidayBPMN.zip");
    ZipInputStream zip = new ZipInputStream(is);
    Deployment deployment = repo.createDeployment()
        .addZipInputStream(zip)
        .name("请假申请单流程")
        .deploy();
    System.out.println(deployment.getName());
    System.out.println(deployment.getId());
}

6. Starting a process instance

public static void main(String[] args) {
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RuntimeService runtime = engine.getRuntimeService();
    ProcessInstance instance = runtime.startProcessInstanceByKey("holiday");
    System.out.println("部署ID" + instance.getDeploymentId());
    System.out.println("定义ID" + instance.getProcessDefinitionId());
    System.out.println("实例ID" + instance.getId());
    System.out.println("活动ID" + instance.getActivityId());
}

7. Querying process definitions

@Test
public void queryProceccDefinition() {
    String key = "holiday";
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repo = engine.getRepositoryService();
    List
list = repo.createProcessDefinitionQuery()
        .processDefinitionKey(key)
        .orderByProcessDefinitionVersion().desc()
        .list();
    for (ProcessDefinition pd : list) {
        System.out.println("------------------------");
        System.out.println("部署ID: " + pd.getDeploymentId());
        System.out.println("定义ID: " + pd.getId());
        System.out.println("名称: " + pd.getName());
        System.out.println("Key: " + pd.getKey());
        System.out.println("版本: " + pd.getVersion());
    }
}

8. Deleting a deployment

public void deleteDeployment() {
    String deploymentId = "8801";
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repo = engine.getRepositoryService();
    // Simple delete (fails if instances exist)
    repo.deleteDeployment(deploymentId);
    // Cascade delete (removes related instances)
    repo.deleteDeployment(deploymentId, true);
}

9. Retrieving BPMN and PNG resources

@Test
public void getProcessResources() throws IOException {
    String procDefId = ""; // fill with actual ID
    ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
    RepositoryService repo = engine.getRepositoryService();
    ProcessDefinition pd = repo.createProcessDefinitionQuery()
        .processDefinitionId(procDefId).singleResult();
    String bpmn = pd.getResourceName();
    String png = pd.getDiagramResourceName();
    System.out.println("bpmn: " + bpmn);
    System.out.println("png: " + png);
    // Write BPMN to file
    try (InputStream in = repo.getResourceAsStream(pd.getDeploymentId(), bpmn);
         FileOutputStream out = new FileOutputStream("d:/process.bpmn")) {
        byte[] buf = new byte[1024];
        int len;
        while ((len = in.read(buf)) != -1) {
            out.write(buf, 0, len);
        }
    }
    // Write PNG to file (similar code)
}

The article also includes SQL snippets for inspecting Activiti tables (ACT_RE_DEPLOYMENT, ACT_RE_PROCDEF, ACT_GE_BYTEARRAY, etc.) and tips for generating BPMN diagram PNGs in IDEA/Eclipse.

JavaWorkflowBPMNSpringActivitiProcessEngine
Top Architect
Written by

Top Architect

Top Architect focuses on sharing practical architecture knowledge, covering enterprise, system, website, large‑scale distributed, and high‑availability architectures, plus architecture adjustments using internet technologies. We welcome idea‑driven, sharing‑oriented architects to exchange and learn together.

0 followers
Reader feedback

How this landed with the community

login Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.