You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java或Camunda库生成含REST调用服务任务的BPMN图?

适合生成BPMN图的Java库推荐

以下几个Java库可以满足你生成包含开始事件、结束事件和REST调用服务任务的BPMN图需求:

1. Camunda BPM Model API

Camunda的模型API是常用选择之一,完全支持BPMN 2.0规范,能轻松创建各类流程元素,包括配置服务任务调用REST API(可通过外部任务或直接在服务任务中定义HTTP请求)。

简单示例代码

import org.camunda.bpm.model.bpmn.Bpmn;
import org.camunda.bpm.model.bpmn.BpmnModelInstance;
import org.camunda.bpm.model.bpmn.instance.*;
import java.io.FileOutputStream;
import java.io.IOException;

public class BpmnGenerator {
    public static void main(String[] args) throws IOException {
        // 创建BPMN模型实例
        BpmnModelInstance modelInstance = Bpmn.createEmptyModel();
        Definitions definitions = modelInstance.newInstance(Definitions.class);
        definitions.setTargetNamespace("http://example.com/bpmn");
        modelInstance.setDefinitions(definitions);

        // 创建流程
        Process process = modelInstance.newInstance(Process.class);
        process.setId("restCallProcess");
        definitions.addChildElement(process);

        // 开始事件
        StartEvent startEvent = modelInstance.newInstance(StartEvent.class);
        startEvent.setId("startEvent");
        process.addChildElement(startEvent);

        // 服务任务(调用REST API)
        ServiceTask serviceTask = modelInstance.newInstance(ServiceTask.class);
        serviceTask.setId("restCallTask");
        serviceTask.setName("调用REST API");
        // 配置REST调用(以Camunda的HTTP连接器为例)
        serviceTask.setCamundaType("external");
        serviceTask.setCamundaTopic("restCallTopic");
        process.addChildElement(serviceTask);

        // 结束事件
        EndEvent endEvent = modelInstance.newInstance(EndEvent.class);
        endEvent.setId("endEvent");
        process.addChildElement(endEvent);

        // 连接元素
        Bpmn.addSequenceFlow(startEvent, serviceTask);
        Bpmn.addSequenceFlow(serviceTask, endEvent);

        // 导出为BPMN XML文件
        FileOutputStream outputStream = new FileOutputStream("rest-process.bpmn");
        Bpmn.writeModelToStream(outputStream, modelInstance);
        outputStream.close();
    }
}

2. Activiti Model API

Activiti作为老牌BPMN引擎,其模型API同样支持完整的BPMN 2.0元素创建,服务任务可通过配置HttpConnector实现REST API调用,适合和Activiti引擎配合使用。

核心代码片段

import org.activiti.bpmn.model.*;
import java.io.File;

public class ActivitiBpmnGenerator {
    public static void main(String[] args) {
        BpmnModel bpmnModel = new BpmnModel();
        Process process = new Process();
        process.setId("restProcess");
        bpmnModel.addProcess(process);

        // 开始事件
        StartEvent startEvent = new StartEvent();
        startEvent.setId("start");
        process.addFlowElement(startEvent);

        // 服务任务配置REST调用
        ServiceTask serviceTask = new ServiceTask();
        serviceTask.setId("restTask");
        serviceTask.setName("调用外部REST接口");
        serviceTask.setImplementationType(ImplementationType.IMPLEMENTATION_TYPE_CONNECTOR);
        serviceTask.setConnectorId("http-connector");
        // 设置HTTP请求参数
        serviceTask.getConnectorParameters().put("url", "https://api.example.com/data");
        serviceTask.getConnectorParameters().put("method", "GET");
        serviceTask.getConnectorParameters().put("headers", "{\"Content-Type\":\"application/json\"}");
        process.addFlowElement(serviceTask);

        // 结束事件
        EndEvent endEvent = new EndEvent();
        endEvent.setId("end");
        process.addFlowElement(endEvent);

        // 添加连线
        process.addFlowElement(new SequenceFlow("start", "restTask"));
        process.addFlowElement(new SequenceFlow("restTask", "end"));

        // 保存为BPMN文件
        try {
            org.activiti.bpmn.converter.BpmnXMLConverter converter = new org.activiti.bpmn.converter.BpmnXMLConverter();
            byte[] xmlBytes = converter.convertToXML(bpmnModel);
            java.io.FileOutputStream fos = new java.io.FileOutputStream(new File("activiti-rest-process.bpmn"));
            fos.write(xmlBytes);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. Eclipse BPMN2 Model API

如果你只需要生成BPMN模型文件,不需要依赖具体流程引擎,Eclipse的BPMN2 Model API是纯模型驱动的选择,它严格遵循BPMN 2.0元模型,可灵活构建各类流程元素。

基础示例

import org.eclipse.bpmn2.*;
import org.eclipse.bpmn2.util.Bpmn2ResourceFactoryImpl;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.ResourceSet;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import java.io.File;
import java.util.HashMap;
import java.util.Map;

public class EclipseBpmnGenerator {
    public static void main(String[] args) {
        ResourceSet resourceSet = new ResourceSetImpl();
        resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("bpmn", new Bpmn2ResourceFactoryImpl());

        Resource resource = resourceSet.createResource(org.eclipse.emf.common.util.URI.createFileURI(new File("eclipse-bpmn.bpmn").getAbsolutePath()));
        Definitions definitions = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createDefinitions();
        definitions.setTargetNamespace("http://example.com/eclipse-bpmn");
        resource.getContents().add(definitions);

        Process process = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createProcess();
        process.setId("eclipseRestProcess");
        definitions.getRootElements().add(process);

        // 开始事件
        StartEvent startEvent = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createStartEvent();
        startEvent.setId("startEvent");
        process.getFlowElements().add(startEvent);

        // 服务任务
        ServiceTask serviceTask = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createServiceTask();
        serviceTask.setId("restServiceTask");
        serviceTask.setName("调用REST API");
        // 通过扩展属性配置REST相关信息
        ExtensionAttribute attr = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createExtensionAttribute();
        attr.setName("restUrl");
        attr.setValue("https://api.example.com/endpoint");
        serviceTask.getExtensionAttributes().add(attr);
        process.getFlowElements().add(serviceTask);

        // 结束事件
        EndEvent endEvent = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createEndEvent();
        endEvent.setId("endEvent");
        process.getFlowElements().add(endEvent);

        // 添加序列流
        SequenceFlow flow1 = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createSequenceFlow();
        flow1.setId("flow1");
        flow1.setSourceRef(startEvent);
        flow1.setTargetRef(serviceTask);
        process.getFlowElements().add(flow1);

        SequenceFlow flow2 = org.eclipse.bpmn2.Bpmn2Factory.eINSTANCE.createSequenceFlow();
        flow2.setId("flow2");
        flow2.setSourceRef(serviceTask);
        flow2.setTargetRef(endEvent);
        process.getFlowElements().add(flow2);

        // 保存模型
        Map<Object, Object> options = new HashMap<>();
        options.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
        try {
            resource.save(options);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

以上三个库都能满足你的需求:Camunda和Activiti的API更贴近实际流程执行场景,适合后续部署运行;Eclipse的BPMN2 API则更偏向纯模型构建,适合仅需生成BPMN文件的场景。

内容的提问来源于stack exchange,提问作者uddeshya pratik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 05:43:11